Це збірка не зовсім документованих фіч для ZF додатків.

Структура проекту на ZF

На даний момент структура каталогу ще не встановилась – читаємо Recommended Project Directory Structure:

project
|– application
| |– apis
| |– configs
| | `– application.ini
| |– controllers
| | `– helpers
| |– layouts
| | | filters–
| | |– helpers
| | `– scripts
| |– models
| | modules–
| | `– <module_name>
| | |– controllers
| | | `– helpers
| | |– views
| | | |– filters
| | | |– helpers
| | | `– scripts
| | `– layouts
| | | filters–
| | |– helpers
| | `– scripts
| `– Bootstrap.php
|– data
| |– cache
| |– indexes
| | locales–
| |– logs
| |– sessions
| `– uploads
|– docs
| library–
| `– Zend
|– public
| |– styles
| | scripts–
| |– images
| |– .htaccess
| `– index.php
`– tests
|– application
| `– bootstrap.php
| library–
| `– bootstrap.php
`– phpunit.xml

Організація моделей у 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. Якщо Вам є що додати – пишіть – думаю, багато будуть Вам вдячні…