У меня назрел вопрос по установке готового Yii-приложения.
Каким именно образом лучше всего устанавливать таблицы и производить все настройки при первом запуске?
Изучив документацию, я вижу два выхода:
использование механизма миграций. Его плюс в том, что он изначально предназначен для установки и внесения изменений в таблицы. Минус (на мой взгляд) в том что в этом случае приходится задействовать консоль - а к ней может и не быть доступа на production-сервере, и непонятно что делать если вам при установке нужно получить от пользователя какие-то данные (например пароль администратора сайта).
Использование метода actionInstall в классе SiteController. Плюс этого метода в том, что он позволяет создать красивый графический инсталлятор и выполнить все действия из браузера, не подключая консоль. Минус для меня состоит в том, что я не уверен что такой путь является "идеологически правильным" с точки зрения архитектуры фреймворка.
В связи с этим вопросы:
Как обычно вы реализуете установку своего приложения?
Код установки всех прав и всех таблиц получился довольно объемным и держать его весь в SiteController неправильно. Куда лучше всего вынести эти методы?
Как вы определяете что это первый запуск приложения? Можно проверить существование какой-нибудь базовой таблицы типа 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 на тестовый и продакш сервера, синхронизация БД - через мигрейшнс.