Structure

Directories

Стандартная структура проекта выглядит следующим образом (корневая директория проекта):

common              содержит общие файлы всех приложений
    config/              содержит общие конфигурационные файлы приложений
    mail/                содержит файлы представлений для электронной почты
    models/              содержит классы моделей, используемые во всех приложениях
    runtime/             временно генерируемые файлы используемые всеми приложениями
    widgets/             классы виджетов приложений
console             консольное приложение, скрипты для крона и прочее
    config/              содержит конфигурационные файлы
    controllers/         содержит консольные контроллеры (commands)
    migrations/          содержит миграции
    models/              содержит классы моделей
    runtime/             временно генерируемые файлы
frontend            приложение 1
    assets/              описание и храенение Asset блоков Yii2
    config/              содержит конфигурационные файлы
    controllers/         contains Web controller classes
    models/              содержит классы моделей
    runtime/             временно генерируемые файлы
    templates/           содержит набор шаблонов
        default/         Файлы представлений шаблона по умолчанию
    web/                 публичная директория (файлы js, css, img...)
        assets/          временные js, css, файлы
    widgets/             классы виджетов приложения

frontend2           приложение 2
//    ... полностью повторяет структуру предыдущего приложения...
frontend3           приложение 3
//    ... полностью повторяет структуру предыдущего приложения...

vendor/                  используемые дополнительные библиотеки в проекте
tests                    contains various tests for the advanced application
    codeception/         contains tests developed with Codeception PHP Testing Framework

Стандартный проект содержит следющие папки в корневой директории проекта:

  • common - файлы общие для всех приложений.
  • console - консольное приложение.
  • frontend - frontend приложение.

Глобальные константы

  • ROOT_DIR — путь до корневой директории проекта
  • ENV — названия окружения (от окружения будет зависеть, то какие настройки будут подключены)

Предопределенные псевдонимы путей

Подробнее про псевдонимы https://www.yiiframework.com/doc/guide/2.0/en/concept-aliases

  • @yii - фремворк директория.
  • @app - базовый путь текущего запущеного приложения.
  • @common - файлы общие для всех приложений.
  • @frontend - frontend приложение.
  • @console - console приложение.
  • @runtime - runtime directory of currently running web application.
  • @vendor - Composer vendor directory.
  • @bower - vendor directory that contains the bower packages.
  • @npm - vendor directory that contains npm packages.
  • @web - base URL of currently running web application.
  • @webroot - web root directory of currently running web application.
  • @root - корневая директория проекта

Алиасы специфичные для ваших проектов, можно прописать в общем конфиге проекта, следующим образом:

'aliases'    => [
    'frontend2'     => '@root/frontend2',
    'frontend3'     => '@root/frontend3',
],

Приложения

По умолчанию в проекте есть два приложения: frontend и console. Frontend обычно представляет то, что представлено конечному пользователю, собственно сам сайт.

Консоль обычно используется для заданий cron и управления серверами низкого уровня. Также он используется во время развертывания приложений и обрабатывает миграции и т.д.

Существует также общий каталог, содержащий файлы, используемые более чем одним приложением. Например, модель пользователя.

Каждое приложение имеет собственное пространство имен и псевдоним, соответствующий его имени. То же самое относится к общему каталогу.

Конфигурирование

Простейшая конфигурация приложения

В файле /frontend/web/index.php определяется путь слияния кофигурационных файлов проекта.

В простейшем виде можно сконфигурировать приложение стандартным способом, вот так может выглядить файл /frontend/web/index.php:

define("ENV", 'prod');
define("ROOT_DIR", dirname(dirname(__DIR__)));

require_once(ROOT_DIR . '/vendor/skeeks/cms/bootstrap.php');

$config = \yii\helpers\ArrayHelper::merge([]
    , require(__DIR__ . '/../../common/config/main.php')
    , require(__DIR__ . '/../../frontend/config/main.php')
);

$application = new \yii\web\Application($config);
$application->run();

В этом случае, как и в любом yii2 проекте, необходимо полность сконфигурировать приложение самостоятельно.

Автоматическая конфигурация приложения

Слиянием файлов конфигураций занимается специальный composer-plugin cms-composer. Подробнее можно прочитать тут: https://habr.com/post/329286/

Идея в том, что любое расширение yii2 (модуль, компонент, пакет), может пердоставить собственные настройки, которые автоматически подключатся к проекту.

Слиянием файлов конфигураций занимается composer по команде или после обновления зависимостей.

Пути слияния прописываются в composer.json проекта, по умолчанию следующим образом:

{
    "extra": {
        "config-plugin": {
            //Каждый из установленных расширений в проекте, уже предоставил конфиги для соответсвующих секций
            "web": [
                "common/config/main.php",
                "common/config/db.php",
                "frontend/config/main.php"
            ],
            "web-dev": [
                "$web",
                "?frontend/config/env/dev/main.php"
            ],
            "web-prod": [
                "$web",
                "?frontend/config/env/prod/main.php"
            ],
            "console": [
                "common/config/main.php",
                "common/config/db.php",
                "console/config/main.php"
            ],
            "console-dev": [
                "$console",
                "?console/config/env/dev/main.php"
            ],
            "console-prod": [
                "$console",
                "?console/config/env/prod/main.php"
            ]
        }
    }
}

А файл /frontend/web/index.php:

define("ENV", 'prod');
define("ROOT_DIR", dirname(dirname(__DIR__)));

require(ROOT_DIR . '/vendor/skeeks/cms/app-web.php');

В приведенной конфигурации проекта, если определить константу ENV как prod

То в web приложении результирующая конфигурация будет состоять из:

"web-prod": [
    "$web", //сюда попадут все конфиги расширений + "common/config/main.php" + "common/config/db.php" + "frontend/config/main.php"
    "?frontend/config/env/prod/main.php"
],

Для того чтобы перекомпилировать конфигурацию приложения, необходимо выполнить команду:

composer du

Для того чтобы посмотреть пути наследования конфигураций:

composer du --verbose

Attention

Не забывайте обновлять файл конфигураций во время разработки!

Автоматическая конфигурация приложения + автообновление конфигураций

define("ENV", 'dev');
define("ROOT_DIR", dirname(dirname(__DIR__)));

//Стандартная загрузка yii2 + всего необходимого для skeeks cms
require(ROOT_DIR . '/vendor/skeeks/cms/bootstrap.php');

//Если включен dev режим работы с сайтом, то сляния настроек будет происходить при выполнении каждого сценария
if (ENV == 'dev') {
    \Yii::beginProfile('Rebuild config');
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    \skeeks\cms\composer\config\Builder::rebuild();
    \Yii::endProfile('Rebuild config');
}

//Подключение стандартного слитого файла конфигураций для текущего окружения
$configFile = \skeeks\cms\composer\config\Builder::path('web-' . ENV);
if (!file_exists($configFile)) {
    $configFile = \skeeks\cms\composer\config\Builder::path('web');
}
$config = (array)require $configFile;

$application = new yii\web\Application($config);
$application->run();

Варианты определения константы ENV

.htaccess

Определение через .htaccess /frontend/web/index.php:

SetEnv ENV dev

/frontend/web/index.php:

$env = getenv('ENV');
if (!empty($env)) {
    defined('ENV') or define('ENV', $env);
}

define("ROOT_DIR", dirname(dirname(__DIR__)));
require(ROOT_DIR . '/vendor/skeeks/cms/app-web.php');

ip адрес

Определение окружения для определенного ip адреса /frontend/web/index.php:

$ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : "";
if (in_array($ip, ['31.148.139...'])) {
    defined('ENV') or define('ENV', 'dev');
}

define("ROOT_DIR", dirname(dirname(__DIR__)));
require(ROOT_DIR . '/vendor/skeeks/cms/app-web.php');

Таким образом любой разработчик имеет возможность иметь собственную конфигурацию, а проект единую кодовую базу. Так же любое установленное расширение, которое предоставляет конфигурацию по текущим правилам, сразу приносит настройку в проект.