Привет всем любителям фреймворка Yii!
В цикле статей, хочу поделиться нашим подходом к разработке проектов на Yii. Возможно кому-то наши идеи будут полезны, возможно для кого-то это будет пища для размышлений, ну а возможно кому-то это нафиг не надо :). Я ни в коем случае не претендую на уникальность, не утверждаю, что делать надо именно так как это делаем мы.
Первый пост будет о конфигурации проекта, понимаю, тема избитая, ну куда ж без нее.
И так, начнем. Первым делом разберем входной скрипт (index.php). Вот как он выглядит у нас:
Первое, что мы здесь делаем — определяем конфигурацию приложения. Путь к конфигу получаем исходя из содержания файлика ".env" который лежит тут же в корне. Если этого файла нет, значит конфиг — «production». Т.е. файл ".env" должен быть только на вашей машине, на боевой сервер его не заливаем, ставим в игнор и т.д. Для чего все это нужно? — для разделения конфигурации продакшен сервера и сервера разработчика.
Плюс в конфиге, я так же определяю соответствующие константы. Например, для дев сервера, это:
Почему в файле конфига, а не в «index.php»? — потому, что значения констант так же зависят от окружения.
Далее, для удобства, можно сделать слияние конфигураций. Т.е. выделить один базовый (main) и конкретные (production, dev, test и т. д.) которые определяют особенности окружения.
В таком случае содержание папки «config» будет примерно таким:
— main.php // основные настройки приложения
— production.php // отличия для продакшен сервера
— dev.php // отличия для сервера разработчика
Пример, содержания файла «dev.php»:
Отмечу, что слияние мы делаем, через нативную 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». Так же он понимает и неймспейсы: для класса «Zend\Paginator\Paginator» путь будет соответственно «library/Zend/Paginator/Paginator.php». Не беспокойтесь, это не повлияет на производительность, т.к. наш автолоадер будет срабатывать после автолоадера Yii. Это поведение определяется второй переменной в «Yii::registerAutoloader()».
Ну и в конце запускаем приложение с массивом наших конфигурационных данных.
На этом сегодня всё. Всем приятного дня!
P.S. На мой взгляд, хороший вариант разделения конфигов (через APPLICATION_ENV), предлагает suver — habrahabr.ru/post/146473. Основное отличие моего способа в том, что не обязательно нужно делать настройки сайта в апаче, это удобно на тот случай когда сайт мы кладем в папку локалхоста (http://localhost/mysite)
В цикле статей, хочу поделиться нашим подходом к разработке проектов на 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" который лежит тут же в корне. Если этого файла нет, значит конфиг — «production». Т.е. файл ".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) и конкретные (production, dev, test и т. д.) которые определяют особенности окружения.
В таком случае содержание папки «config» будет примерно таким:
— main.php // основные настройки приложения
— production.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». Так же он понимает и неймспейсы: для класса «Zend\Paginator\Paginator» путь будет соответственно «library/Zend/Paginator/Paginator.php». Не беспокойтесь, это не повлияет на производительность, т.к. наш автолоадер будет срабатывать после автолоадера Yii. Это поведение определяется второй переменной в «Yii::registerAutoloader()».
Ну и в конце запускаем приложение с массивом наших конфигурационных данных.
На этом сегодня всё. Всем приятного дня!
P.S. На мой взгляд, хороший вариант разделения конфигов (через APPLICATION_ENV), предлагает suver — habrahabr.ru/post/146473. Основное отличие моего способа в том, что не обязательно нужно делать настройки сайта в апаче, это удобно на тот случай когда сайт мы кладем в папку локалхоста (http://localhost/mysite)