Какой Лучший Способ Установки Готового Yii-Приложения?

Приветствую.

У меня назрел вопрос по установке готового Yii-приложения.

Каким именно образом лучше всего устанавливать таблицы и производить все настройки при первом запуске?

Изучив документацию, я вижу два выхода:

  1. использование механизма миграций. Его плюс в том, что он изначально предназначен для установки и внесения изменений в таблицы. Минус (на мой взгляд) в том что в этом случае приходится задействовать консоль - а к ней может и не быть доступа на production-сервере, и непонятно что делать если вам при установке нужно получить от пользователя какие-то данные (например пароль администратора сайта).

  2. Использование метода actionInstall в классе SiteController. Плюс этого метода в том, что он позволяет создать красивый графический инсталлятор и выполнить все действия из браузера, не подключая консоль. Минус для меня состоит в том, что я не уверен что такой путь является "идеологически правильным" с точки зрения архитектуры фреймворка.

В связи с этим вопросы:

  1. Как обычно вы реализуете установку своего приложения?

  2. Код установки всех прав и всех таблиц получился довольно объемным и держать его весь в SiteController неправильно. Куда лучше всего вынести эти методы?

  3. Как вы определяете что это первый запуск приложения? Можно проверить существование какой-нибудь базовой таблицы типа users - но возможно существует более красивое решение?

Думаю, тут лучше начать с вопроса "А откуда приложение узнает о конфиге БД", и уже от него отталкиваться.

В частности, отсутствие конфига БД как раз можеть быть маркером первичного запуска приложения.

PS. Лично я предпочитаю все инсталляции проводить вручную, а с хостингами, не дающими консоль, стараюсь не связываться. Практика показывает, что отсутствие банального ssh на хостинге - первый признак будущих проблем.

Маленькое замечание - для использования мигрейшнс не обязательно нужна консоль, например, можно добавить метод наподобие





    /**

 	* Performs db migration to the latest available version

 	*/

    public function actionMigrate()

    {

        try{

            $commandPath = Yii::app()->getBasePath() . DIRECTORY_SEPARATOR . 'commands';

            $runner = new CConsoleCommandRunner();

            $runner->addCommands($commandPath);

            $commandPath = Yii::getFrameworkPath() . DIRECTORY_SEPARATOR . 'cli' . DIRECTORY_SEPARATOR . 'commands';

            $runner->addCommands($commandPath);

            $args = array('yiic', 'migrate', '--interactive=0');

            ob_start();

            $runner->run($args);

            echo htmlentities(ob_get_clean(), null, Yii::app()->charset);        

        }catch(Exception $e){

            echo $e->getMessage();

        }

    }



Еще есть расширение(я) к yii для работы с консолью из браузера.

По поводу установочного скрипта - только единожды, по запросу заказчика, добавляла обычный php скрипт где собираются данные для конфигурации сайта и им же разворачивается база данных, само же приложение выгружается по фтп.

Чаще всего настраиваю авто-деплой из VCS на тестовый и продакш сервера, синхронизация БД - через мигрейшнс.

Большое спасибо за ответы.

Речь идет о приложении с заранее заданым конфигом.

Способ с actionMigrate обязательно возьму на вооружение - для моей текущей задачи это будет очень полезно.

В итоге реализовал вариант с actionInstall в классе SiteController - приложение теперь можно установить одним http-запросом на нужную страницу.

Признаком установленного приложения пока все-таки выбрал существование таблицы "users":




/** Определяет, установлено уже приложение или нет.

 * 	 

 * @return bool	 

 */

protected function applicationIsAlreadyInstalled()	

{

    if ( Yii::app()->db->schema->getTable('{{users}}') )

    {

        return true;

    }	    	    

    return false;	

}

Просто хотелось узнать, существуют ли стандартные методы решения этой задачи в самом фреймворке - вдруг я просто не нашел.

Стандартные методы - понятие весьма растяжимое. У каждого своё решение…