Привет всем любителям фреймворка 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