Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Введение в Zend Framework 2.0

Dd3f18c87b851137000c7427d7bd5d32?s=47 fwdays
November 14, 2011

Введение в Zend Framework 2.0

* С чего начать?
- Немного истории о фреймворке
- Откуда черпать информацию о ZF2
* Переход с ZF1 на ZF2
- Слабые стороны ZF1
- Сильные стороны ZF2 (о слабых говорить пока рано)
- Основные различия между версиями
* Самые заметные нововведения:
- EventManager
- Dependency Injection (Zend\Di)
- Новая архитектуре MVC
* Модули в ZF2 (Zend\Module), сравнение с бандлами из Symfony2

Dd3f18c87b851137000c7427d7bd5d32?s=128

fwdays

November 14, 2011
Tweet

More Decks by fwdays

Other Decks in Programming

Transcript

  1. Введение в Zend Framework 2.0 Валерий Рабиевский stfalcon.com mail@ftrrtf.com twitter.com/ftrrtf

    github.com/ftrrtf
  2. Zend Framework Timeline  Октябрь 2005: Анонс  Март 2006:

    0.1.0  Июль 2007: 1.0.0  Март 2008: 1.5.0  Сентябрь 2008: 1.6.0  Ноябрь 2008: 1.7.0
  3. Zend Framework Timeline  Апрель 2009: 1.8.0  Июль 2009:

    1.9.0  Январь 2010: 1.10.0  Февраль 2010: Начата работа над ZF 2.0  Ноябрь 2011: 1.11.0  Октябрь 2011: 2.0.0beta1
  4. Откуда черпать информацию о ZF2  http://dev.ftrrtf.com/zf2 – Официальные ресурсы

    – Подборка презентаций – Обзоры в блогах – ...
  5. Слабые стороны ZF1  Singletons  Registries  Hard-coded dependencies

     Невысокая производительность  Очень слабая реализация модулей  Многогодовая тянучка с предложениями (proposals)
  6. Сильные стороны ZF2  Получше производительность – Переработанная архитектура –

    Улучшение автозагрузки (отказ от require, «карты классов» и т.д.)  Использование новых фич PHP 5.3  Фреймворк стал еще гибче в использовании  Модули (ну наконец-то!)  …
  7. Contributing to Zend Framework 2.0  Оригинальный репозиторий – http://git.zendframework.com/?a=summary&p=zf

     Клон на GitHub (обновляется 2 раза в сутки) – https://github.com/zendframework/zf2  Багтрекер оставили свой – http://framework.zend.com/issues/browse/ZF2
  8. Contributor License Agreement

  9.  Хоть и значительно изменена архитектура, но: – все компоненты

    на месте; – код контроллеров поменялся не значительно; – шаблоны видов также не особо поменялись; – фактически получится просто рефакторинг с изменением структуры приложения, и адаптацией под новый API.  Наверное больше времени займет адаптация проекта для использования неймспейсов (хотя можно автоматизировать)  НО! Чем ближе к релизу – тем меньше шансов, что все останется так же радужно :) Переход с ZF1 на ZF2
  10. Самые заметные нововведения в ZF2

  11. EventManager  Реализация простого subject/observer паттерна  Реализация аспектно-ориентированного дизайна

     Реализация событийно-ориентированной архитектуры (event-driven)
  12. Событийная архитектура  Уже используется в: – Zend\Module – Zend\MVC

    • (Application, Controller, Plugin) – Zend\Session
  13. Событийная архитектура  Использование в Zend\MVC\Application: protected function attachDefaultListeners() {

    $events = $this->events(); $events->attach('route', array($this, 'route')); $events->attach('dispatch',array($this,'dispatch')); }  Благодаря такой архитектуре очень просто подменить ту или иную логику на свою.
  14. Dependency Injection (Zend\Di)  Два основных компонента: – Definition –

    Instance Configuration
  15.  Грубо говоря – инъекции всегда передаются в код двумя

    методами: – через параметры конструктора; – через методы (сеттеры). Dependency Injection (Zend\Di)
  16.  Во время выполнения (по требованию): – самое то для

    разработки, совсем не годится для продакшена (особенно при использовании аннотаций)  Компиляция (Reflection+Scanner): – компилируется в массив, используется с ArrayDefinition  Вручную – ClassDefinition – BuilderDefinition DI: построение определений
  17. DI: пример использования namespace MovieApp { class Lister { public

    $finder; public function __construct(Finder $finder){ $this->finder = $finder; }} class Finder { /*...*/ } } namespace { /*bootstrap*/ $di = new Zend\Di\Di; $lister = $di->get('MovieApp\Lister'); $works = ($lister->finder instanceof MovieApp\Finder); echo (($works) ? 'It works!' : 'It DOES NOT work!'); }
  18.  Больше примеров: https://github.com/ralphschindler/Zend_DI-Examples Dependency Injection

  19. MVC Layer  Слой MVC является надстройкой над следующими компонентами:

    – Zend\Di, (в частности, ее интерфейс Locator) – Zend\EventManager – Zend\Http – Zend\Stdlib\Dispatchable  А также содержит в себе: – Zend\Mvc\Router – Zend\Mvc\PhpEnvironment – Zend\Mvc\Controller
  20. MVC: RestfulController  GET → getList() или get(), если передан

    id  POST → create() – Этот метод ожидает данные, как правило из суперглобального массива $_POST. – Код ответа 201  PUT → update() – Обязательный параметр id – Код ответа 200 или 202  DELETE → delete() – Обязательный параметр id – Код ответа 200 или 204
  21. Модули в ZF1  Ограниченные возможности повторного использования  Нет

    механизма распределения  Тесная связь с MVC  Затратный bootstrap  Нет управления зависимостями  ...
  22.  Автономные, портативные, готовы к повторному использованию  Phar packaging/Pyrus

    distribution  Управление зависимостями  «Легкие на подъем»: значительно улучшена производительность  ...  В общем – все «детские болезни» из ZF1 исправили Модули в ZF2 (Zend\Module)
  23. Самый простой ZF2 модуль Структура: |~modules/ | |~MyModule/ | |

    `-Module.php Содержимое файла ./modules/MyModule/Module.php: <?php namespace MyModule; class Module {}
  24. Рекомендуемая структура модуля |~module_root/ | |~configs/ | | `-module.config.php |

    |~public/ | | |+css/ | | |+images/ | | `+js/ | |~src/ | | `~<module_namespace>/ | | `-<code files> | |+tests/ | |~views/ | | `~<controller-name>/ | | `-<.phtml files> | |-autoload_classmap.php | |-autoload_function.php | |-autoload_register.php | `-Module.php
  25. Module::init($moduleManager) Необязательный метод Только для не затратных операций – Регистрация

    автолоадера – Регистрация слушателей событий (event listeners)
  26. Module::getConfig($env = null) Необязательный метод Обозначение среды (environment) передается строкой

    Должен возвращать Zend\Config\Config
  27. Использование событий в модулях class Module { public function init(ModuleManager

    $moduleManger) { $events = $moduleManager->events(); $events->attach('init.post', array($this, 'postInit')); } public function postInit($e) { $moduleManager = $e->getTarget(); $loadedModules = $moduleManager->getLoadedModules(); $config = $moduleManager->getMergedConfig(); } }
  28. Dependency manager Если в модуле есть метод getProvides(), и включено

    автоподключение модулей: – выполнится autoInstall() или autoUpgrade() для корректной установки/обновления Проверка зависимостей – Описание зависимостей возвращает метод getDependencies(): return array( 'php' => array( 'version' => '5.3.0', 'required' => true, ), 'ext/pdo_mysql' => true );
  29. Phar «Упаковать» модуль очень просто: $ tar -cf MyModule.tar MyModule/

    Поддерживаются все Phar-форматы:  phar, phar.gz, phar.bz2, phar.tar, phar.tar.gz, phar.tar.bz2, phar.zip, tar, tar.gz, tar.bz2, zip
  30. Phar: нюансы Запакованные модули не должны ничего писать внутри своей

    директории Никаких realpath() или glob() (PHP Bug #52769)
  31. Спасибо за внимание! Есть вопросы? Валерий Рабиевский mail@ftrrtf.com twitter.com/ftrrtf github.com/ftrrtf