Это сборник не совсем документированных фич для ZF приложений.
Структура проекта на ZF
На данный момент структура каталога еще не устаканилась – читаем Recommended Project Directory Structure:
project |-- application | |-- apis | |-- configs | | `-- <em>application.ini</em> | |-- controllers | | `-- helpers | |-- layouts | | |-- filters | | |-- helpers | | `-- scripts | |-- models | |-- modules | | `-- <module_name> | | |-- controllers | | | `-- helpers | | |-- views | | | |-- filters | | | |-- helpers | | | `-- scripts | | `-- layouts | | |-- filters | | |-- helpers | | `-- scripts | `-- <em>Bootstrap.php</em> |-- data | |-- cache | |-- indexes | |-- locales | |-- logs | |-- sessions | `-- uploads |-- docs |-- library | `-- Zend |-- public | |-- styles | |-- scripts | |-- images | |-- <em>.htaccess</em> | `-- <em>index.php</em> `-- tests |-- application | `-- <em>bootstrap.php</em> |-- library | `-- <em>bootstrap.php</em> `-- <em>phpunit.xml</em>
Организация моделей в ZF
Кроме официального мануала с примером создания модели, я нашел еще два авторитетных источника:
- On models in a Zend Framework application
- Model Infrastructure
Zend Framework и SVN
Лучшая версия ZF лежит всегда в транке SVN’а – при этом snapshot’ы выкладываются не всегда адекватные, по этой причине лучше настроить экспорт для вашего проекта:
~$ svn propedit svn:externals library/ Zend http://framework.zend.com/svn/framework/standard/trunk/library/Zend ZendX http://framework.zend.com/svn/framework/extras/trunk/library/ZendX ~$ svn propedit svn:externals lpublic/scripts/ dojo http://svn.dojotoolkit.org/src/dojo/trunk/ dijit http://svn.dojotoolkit.org/src/dijit/trunk/ dojox http://svn.dojotoolkit.org/src/dojox/trunk/
Zend_Application и Zend_Bootstrap
Подключаем namespace для Autoloader’a
В официальной документации нет описания по добавлению неймспейсов посредством ini файла, исправляем:
; папка Core находится в library и включена в include_path autoloadernamespaces[] = Core
Подключаем кастомные плагины для ресурсов (на примере класса Core_Resource_View)
Код конфигурационного файла application.ini:
; прописываем путь - Core_Resource - префикс имени класса pluginPaths.Core_Resource = APPLICATION_PATH "/resources" ; инициализируем ресурс (хотя бы таким способом) resources.view[] = ; передаем параметры resources.view.title = "My Application" resources.view.encoding = "UTF-8"
Код плагина View можете найти в официальной документации: Zend_Application: Examples
Прописываем плагины для FrontController’a в application.ini
resources.frontController.plugins[] = "Core_Controller_Plugin_Layout" resources.frontController.plugins[] = "Core_Controller_Plugin_ErrorHandler" // если необходимо передать паарметры // пока не работает, отслеживаем http://framework.zend.com/issues/browse/ZF-6704 resources.frontController.plugins.errorhandler.classname = "Zend_Controller_Plugin_ErrorHandler" resources.frontController.plugins.errorhandler.options.module = "system" resources.frontController.plugins.errorhandler.options.controller = "error" resources.frontController.plugins.errorhandler.options.action = "error"
Это аналогично следующей записи в Bootstrap.php:
/** * @return Zend_Application */ protected function _initPlugins() { $bootstrap = $this->getApplication(); if ($bootstrap instanceof Zend_Application) { $bootstrap = $this; } $bootstrap->bootstrap('FrontController'); $front = $bootstrap->getResource('FrontController'); $front->registerPlugin(new Core_Controller_Plugin_Layout()); $front->registerPlugin(new Core_Controller_Plugin_ErrorHandler()); return $bootstrap; }
Используем различные layout’ы для модулей
Создаем новый плагин Сore_Controller_Plugin_Layout (файл library/Core/Controller/Plugin/Layout.php):
class Core_Controller_Plugin_Layout extends Zend_Controller_Plugin_Abstract { public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) { $layout = Zend_Layout::getMvcInstance(); // указываем путь к layout'ам $layout ->setLayoutPath(APPLICATION_PATH . '/modules/' . $request->getModuleName() . '/layouts/scripts'); } }
Примечание: неймспейс Core должен быть проинициализирован для автолоадера
Используем различные ErrorController’ы для модулей
Создаем новый плагин Сore_Controller_Plugin_ErrorHandler (файл library/Core/Controller/Plugin/ErrorHandler.php):
class Core_Controller_Plugin_ErrorHandler extends Zend_Controller_Plugin_Abstract { public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) { $frontController = Zend_Controller_Front::getInstance(); $errorPlugin = $frontController->getPlugin('Zend_Controller_Plugin_ErrorHandler'); $errorPlugin->setErrorHandlerModule($request->getModuleName()); } }
Примечание: неймспейс Core должен быть проинициализирован для автолоадера
Прописываем роуты в application.ini
Роут для перенаправления страниц вида “чего-то-там.html” на контроллер “pages”, экшен “index”, и именем запрашиваемой страницы в переменной “alias”:
; Page resources.router.routes.page.type = "Zend_Controller_Router_Route_Regex" resources.router.routes.page.route = "([a-z0-9\-]+)\.html" resources.router.routes.page.defaults.module = default resources.router.routes.page.defaults.controller = pages resources.router.routes.page.defaults.action = index resources.router.routes.page.map.1 = alias
Работаем с конфигом application.ini
Многие привыкли работать с конфигом используя Zend_Regitry:
$configuration = new Zend_Config_Ini( APPLICATION_PATH . '/config/app.ini', APPLICATION_ENVIRONMENT ); $registry = Zend_Registry::getInstance(); $registry->configuration = $configuration;
С версии 1.8 используем следующий синтаксис:
// В контроллере можно сделать так: $bootstrap = $this->getInvokeArg('bootstrap'); $configArray = $bootstrap->getOptions(); // либо так: $this->getInvokeArg('bootstrap')->getOption('option'); // А если нужен экземпляр объекта Zend_Config, то надо добавить строчку: $config = new Zend_Config($configArray);
Или, можно таки заюзать Zend_Registry и проинициализировать его в классе Bootstrap:
public function _initConfig() { Zend_Registry::set('config', new Zend_Config($this->getOptions())); }
Подсмотрено: Хитрости ZF1.8
Zend_Db
Инициализация профайлера посредством конфигурационного файла application.ini:
; говорим что нужно использовать профайлер resources.db.params.profiler.enabled = true ; указываем желаемый профайлер resources.db.params.profiler.class = Zend_Db_Profiler_Firebug
Zend_Test
Приведу ссылки на полезные ресурсы по тестированию приложений на ZF:
- Zend_Test – официальный мануал в скудном состоянии
- An Introduction to the Art of Unit Testing in PHP
- PHPUnit: Testing Zend Framework Controllers (перевод)
- Setting up your Zend_Test test suites
- Automatic testing of MVC applications created with Zend Framework
- Автоматизированное тестирование Zend Framework приложений
- Топик на форуме zendframework.ru
P.S. Если Вам есть что добавить – пишите – думаю, многие будут Вам благодарны…
Касательно организации моделей можно еще добавить ссылку на статью из книги Pádraic Brady
http://www.survivethedeepend.com/zendframeworkbook/en/1.0/the.model
Ссылка “On models in a Zend Framework application” умерла
Жива ссылка, не пугайте народ почем зря…
Принимай эстафету :)
http://www.getincss.ru/2009/06/07/verstka-sajta-chto-neobxodimo-uchest/
permisi om … nama saya Ardiansyah berasal dari negara Indonesia. beberapa waktu lalu saya mendownload pdf mas Anton yang judulnya SEO Cheat Sheet v.04. dan berharap izin dari mas Anton untuk menyalin dan menampilkannya kembali di situs blog saya. saya minta maaf karena menulis ini tidak dalam bahasa Inggris atau Rusia karena saya tidak bisa kedua-duanya.
salam persahabatan dari saya,
Ardiansyah
Indonesia (ID)
Ok, anda dapat menampilkan PDF di blog Anda
resources.db.params.profiler.enabled = true
resources.db.params.profiler.class = Zend_Db_Profiler_Firebug
Если выставить enabled в false, то профайлер все равно включается
И еще работает даже если в конфиге указать только
resources.db.params.profiler.class = Zend_Db_Profiler_Firebug
Просто замечательная статья! Незаменима для старта работы на зендфреймворке. Жалко что мало тем раскрыто, я бы с удовольствием почитал бы про плагины, хелперы, тестирование, или Json в этом же стиле.
Спасибо, очень познавательно. Небольшой вопросик.
Возможно ли инициализацию для ‘Action helpers’ добавить в application.ini?
Например такой код:
Инициализация application.ini для Action helpers
resources.frontController.actionhelperpaths.My_Action_Helper = “My/Action/Helper”
Наверное опечатка? Что за папка lpublic :)
У меня вопрос по поводу инициализации конфига в Zend_Registry (ипользуя _initConfig() в Bootstrap.php)
Каким образом я потом смогу получать custom значения из него?
В application.ini дописываю секцию [custom], но в Zend_Registry::get(‘config’) этой секции почему-то нет :(