- PVSM.RU - https://www.pvsm.ru -
Хочу поделиться альтернативным рецептом файловой структуры для нескольких приложений в Yii2-advanced, не прибегая к модулям. Внешние отличия, к которым мы придем, выглядят следующим образом:
Я видел на Хабре статью, как разные окружения превратить в модули и сложить их аккуратно внутри проекта. Мне кажется идея, которую мне показал коллега — намного круче и удобнее!
Разве это не круто?!
PS: Да, и кстати, к радости начинающих: вы можете решить проблему «как сделать общий upload для front&back».
PPS: Я рассчитываю, что вы уже установили и опробовали YII2 Advanced, и понимаете, зачем вам именно этот вариант.
Интересно? Тогда — вперед! Для примера беру последнюю, на текущий момент версию: 2.0.10.
// определяем запрошенный APP
switch ($_SERVER['HTTP_HOST']) {
case 'frontend.dev':
case 'site.ru':
define('YII_APP', 'frontend');
break;
case 'backend.dev':
case 'admin.site.ru':
define('YII_APP', 'backend');
break;
default:
// лично у меня тут 301й редирект на главную
exit("domain not defined");
}
// определяем папку приложения и подключаем его конфиг
define('YII_APP_DIR', Yii::getAlias('@apps') . '/' . YII_APP);
require(YII_APP_DIR . '/config/bootstrap.php');
$config = yiihelpersArrayHelper::merge(
require(__DIR__ . '/../common/config/main.php'),
require(__DIR__ . '/../common/config/main-local.php'),
require(YII_APP_DIR . '/config/main.php'),
require(YII_APP_DIR . '/config/main-local.php')
);
Добавляем алиас: Yii::setAlias('@apps', dirname(dirname(__DIR__)). '/apps');
Наши приложения правим по принципу: Yii::setAlias('@console', Yii::getAlias('@apps'). '/console');.
#!/usr/bin/env php
<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
define('YII_APP', 'console');
require(__DIR__ . '/vendor/autoload.php');
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/common/config/bootstrap.php');
require(__DIR__ . '/apps/console/config/bootstrap.php');
$config = yiihelpersArrayHelper::merge(
require(__DIR__ . '/common/config/main.php'),
require(__DIR__ . '/common/config/main-local.php'),
require(__DIR__ . '/apps/console/config/main.php'),
require(__DIR__ . '/apps/console/config/main-local.php')
);
$application = new yiiconsoleApplication($config);
$exitCode = $application->run();
exit($exitCode);
appsconsoleconfigmain.php правим участок с merge
$params = array_merge(
require(__DIR__ . '/../../../common/config/params.php'),
require(__DIR__ . '/../../../common/config/params-local.php'),
require(__DIR__ . '/params.php'),
require(__DIR__ . '/params-local.php')
);
Все!
Довольно простыми манипуляциями для человека немного поработавшего с YII2 мы получили структурированный по приложениям проект, который откликается на любое количество доменов и удобен на бюджетных хостингах, когда у нас есть лишь 1 каталог. Либо манипуляции с каталогами и сим-линками вызывает определенные проблемы.
Рассчитываю, что мой труд оказался вам интересен. В конце лишь добавлю возможные вопросы, которые могут возникнуть в этой непривычной архитектуре.
В: У меня, на шаге Х просто белый экран!
О: Вы допустили опечатку до инициализации Yii. Временно добавьте в самое начало index.php строку: ini_set(«display_errors»,«1»); ini_set(«error_reporting», E_ALL);
В: Скомпиленные Ассеты могут смешаться?
О: Вряд ли. Почти за год работы проекта не отмечено ни одного случая
В: Robots и favico не для каждого домена, а смешаны в кучу?
О: Всегда можно разрулить реврайтами апача по RewriteCond %{HTTP_HOST}
В: А как можно получить ссылку из другого приложения? На примере «модулей», это было бы элементарно.
О: Создайте дополнительную компоненту и Yii::$app->urlManagerFrontend->createUrl(...);
Автор: lgXenos
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/php-2/217568
Ссылки в тексте:
[1] хостинге: https://www.reg.ru/?rlink=reflink-717
[2] Источник: https://habrahabr.ru/post/316966/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox
Нажмите здесь для печати.