Способ конфигурации проектов Yii от ГлавВеб

в 7:36, , рубрики: yii, метки:

Привет всем любителям фреймворка Yii!

В цикле статей, хочу поделиться нашим подходом к разработке проектов на Yii. Возможно кому-то наши идеи будут полезны, возможно для кого-то это будет пища для размышлений, ну а возможно кому-то это нафиг не надо :). Я ни в коем случае не претендую на уникальность, не утверждаю, что делать надо именно так как это делаем мы.

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

И так, начнем. Первым делом разберем входной скрипт (index.php). Вот как он выглядит у меня:

<?php
$rootPath = dirname(__FILE__);

/**
 * Define config
 */
$env = null;
$envFile = $rootPath . '/.env';
if (is_file($envFile)) {
    $env = trim(file_get_contents($envFile));
}

$configFile = $rootPath . '/application/config/production.php';
if (!empty($env)) {
    $configFile = $rootPath . '/application/config/' . $env . '.php';
    if (!file_exists($configFile)) {
        die('Config file is not found.');
    }
}
$config = require $configFile;


/**
 * Create and run application
 */
$libraryPath = $rootPath . '/library';
require_once $libraryPath . '/yii/yii.php';

$autoloader = function($class) 
{
    global $libraryPath;
    
    $path = $libraryPath . '/'
          . implode(preg_split('/[_\]/', (string)$class, -1, PREG_SPLIT_NO_EMPTY), DIRECTORY_SEPARATOR)
          . '.php';
    
    if (is_file($path)) {
        include_once $path;
    }
};

Yii::registerAutoloader($autoloader, true);
Yii::createWebApplication($config)->run();

Первое, что мы здесь делаем — определяем конфигурацию приложения. Путь к конфигу получаем исходя из содержания файлика «.env» который лежит тут же в корне. Если этого файла нет, значит конфиг — «prodaction». Т.е. файл ".env" должен быть только на вашей машине, на боевой сервер его не заливаем, ставим в игнор и т.д… Для чего все это нужно? — для разделения конфигурации продакшен сервера и сервера разработчика.

Плюс в конфиге, я так же определяю соответствующие константы. Например, для дев сервера, это:

define('YII_DEBUG', true);
define('YII_TRACE_LEVEL', 3);
define('YII_ENABLE_ERROR_HANDLER', true);
define('YII_ENABLE_EXCEPTION_HANDLER', true); 

Почему в файле конфига, а не в «index.php»? — потому, что значения констант так же зависят от окружения.

Далее, для удобства, можно сделать слияние конфигураций. Т.е. выделить один базовый (main) и конкретные (prodaction, dev, test и т. д.) которые определяют особенности окружения.
В таком случае содержание папки «config» будет примерно таким:
— main.php // основные настройки приложения
— prodaction.php // отличия для продакшен сервера
— dev.php // отличия для сервера разработчика

Пример, содержания файла «dev.php»:

define('YII_DEBUG', true);
define('YII_TRACE_LEVEL', 3);
define('YII_ENABLE_ERROR_HANDLER', true);
define('YII_ENABLE_EXCEPTION_HANDLER', true); 

return array_replace_recursive(
    require dirname(__FILE__) . '/main.php', 
    array(
        'components' => array(
            'db' => array(
             // Настройки для базы данных
            ),
        ),
    )
);

Отмечу, что слияние мы делаем, через нативную PHP функцию «array_replace_recursive()», а не по средства фреймоврка «CMap::mergeArray()» (как это советует кукбук). Помним, что на этот момент мы ещё не подключили библиотеку Yii. А не подключили, потому, что это вызовет конфликт констант определённых в нашем конфиге и констант определённых в yii.php.

Если посмотреть на содержание «index.php», то можно заметить, что мы немного отшли от стандартного нейминга корневых директорий принятых в Yii. В корне у нас всего 3 папки:
— application // тоже, что и protected
— library // здесь лежат используемые библиотеки, в том числе и Yii
— public // файлы которые доступны из веба, например css, js, изображения.
— assest // папка для assets файлов

По большей части, такая структура, это дело привычки оставшейся из Zend-а.

Для того, что бы наши assets складывались в «public/assets» в конфиге в компоненте «assetManager» нужно переопределить свойства «basePath» и «baseUrl».

Смотрим далее. В «index.php» мы определяем и регистрируем дополнительный автолоадер. Зачем? Для того, что бы безболезненно подключать дополнительные библиотеки из директории «library». Т.е. наш автолоадер ищет файл в папке «library» по имени соответствующего класса и подключает его. Допустим для класса «Zend_Paginator» путь будет «library/Zend/Paginator.php». Так же он понимает и неймспейсы: для класса «ZendPaginatorPaginator» путь будет соответственно «library/Zend/Paginator/Paginator.php»

Ну и в конце запускаем приложение с массивом наших конфигурационных данных.

На этом сегодня всё. Всем приятного дня!

P.S. Хороший вариант разделения конфигов (через APPLICATION_ENV), предлагает suver — habrahabr.ru/post/146473/. Основное отличие моего способа в том, что не обязательно нужно делать настройки сайта в апаче, это удобно на тот случай когда сайт мы кладем в папку локалхоста (http://localhost/mysite)

Автор: Nilov_A

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js