Александр Симанович
   Руководитель группы разработчиков
    MTV Entertainment в EPAM Systems
   PHP Skill Manager в EPAM Systems
   Enrico Zimuel
     ZF core developer
     ZFConf 2012
   Обзор ZF2
   Новая система Autoloading
   Dependency Injection
   Event manager
   Новый MVC
   Быстрый старт: ZendSkeletonApplication
   Система пакетов (packages)
   От ZF1 к ZF2
   Новая архитектура (MVC, DI, Events)
   >= PHP 5.3
   Отменен CLA (Contributor License
    Agreement)
   Git (GitHub) вместо SVN
   Улучшенная производительность
   Модульность
   Система пакетов (packages)
   Подход ZF1:
     Singleton
     Registry
     Hard-Coded Dependencies
   Подход ZF2:
     Aspect Oriented Design
     Dependency Injection
   Методологии
     Уменьшение связанности кода (ZendDi)
     Событийность (ZendEventManager)
     Стандартные классы (ZendStdlib)
   Используются возможности PHP 5.3
     Namespace
     Лямбда функции и замыкания
     Лучшая производительность
   Никаких require_once
   Множество подходов:
     Стиль ZF1: include_path autoloader
     Autoloading по префиксу или неймспейсу
     Class-map autoloading
   Генерация .classmap.php из командной
    строки:
    bin/classmap_generator.php
   Usage is trivial:
    $ cd your/library
    $ php /path/to/classmap_generator.php -w
   Class-Maps дают 25% прироста по
    сравнению ZF1 autoloader без
    акселерации, 60-80% прироста, если
    используется кэширование опкода
   Связывание неймспейсов/префиксов с
    путем дает >10% прироста
    производительности без акселерации,
    40% - с кэшированием опкода

Note: новый autoloading доступен в ZF 1.12
   Как управлять зависимостями между
    объектами?
   Dependency injection (DI) это шаблон
    проектирования, который снижает
    связанность между компонентами
    программы
class Foo {
    protected $bar;
    …
    public function __construct() {
         $this->bar= new Bar();
    }
    …
}
class Foo {
     protected $bar;
     …
     public function __construct(Bar $bar) {
          $this->bar = $bar;
     }
     …
}
class Foo {
     protected $bar;
     …
     public function setBar(Bar $bar) {
          $this->bar = $bar;
     }
     …
}
WITHOUT DI                WITH DI (CONSTRUCT)

Недостатки:               Преимущества:
  Сложно тестировать       Легко тестировать
  Нет изоляции             Низкая связанность
  Сложность повторного     Гибкая архитектура
   использования
   Поддерживает 3 типа инъекций:
     Constructor
     Interface
     Setter
   Реализует DI Container:
     Управление зависимостями с помощью
     конфигураций и аннотаций
$definition = array(
     'Foo' => array(
          'setBar' => array(
               'bar' => array(
                     'type'     => 'Bar',
                     'required' => true,
               ),
          ),
     ),
);
use ZendDiDi,
     ZendDiConfiguration;
$di = new Di;
$config = new Configuration(array(
     'definition' => array(
          'class' => $definition
     )
));
$config->configure($di);
$foo = $di->get('Foo'); // contains Bar!
namespace Example {
      use ZendDiDefinitionAnnotation as Di;
      class Foo {
            public $bar;
            /**
             * @DiInject()
             */
            public function setBar(Bar $bar){
                  $this->bar = $bar;
            }
      }
      class Bar {
      }
}
$compiler = new
ZendDiDefinitionCompilerDefinition();

$compiler->addDirectory('File path of Foo and Bar');
$compiler->compile();

$definitions = new ZendDiDefinitionList($compiler);
$di = new ZendDiDi($definitions);

$baz = $di->get('ExampleFoo'); // contains Bar!
   Event Manager – объект, агрегирующий
    слушателей для одного или нескольких
    событий, а также вызывающий события
   Listener – callback, реагирующий на
    события – слушатель.
   Event – это действие
use ZendEventManagerEventManager;
$events = new EventManager();
$events->attach('do', function($e) {
      $event = $e->getName();
      $params = $e->getParams();
      printf(‘Еvent “%s”, with parameters %s',
            $event, json_encode($params));
});
$params = array('foo' => 'bar', 'baz' => 'bat');
$events->trigger('do', null, $params);
   Bootstrap, route, dispatch, response…
   В MVC ZF2 все является событием
   Базовый блок в ZF2 MVC приложении это
    модуль
   Модуль это коллекция кода и других
    файлов, которые решают специфическую
    атомарную задачу большой бизнес задачи
   Модуль это:
     Namespace
     Module.php
   Простой скелет приложения,
    использующий ZF2 MVC и модульную
    систему
   Работает на ZF2.0.0beta4
   Весь на код на GitHub, submodules…


git clone –recursive
git://github.com/zendframework/ZendSkeletonApplication.git
...
'router' => array(
       'routes' => array(
       ...
       ),
),
'controller' => array(
       'classes' => array(
               'index' => 'ApplicationControllerIndexController'
       ),
),
'view_manager' => array(
       'display_not_found_reason' => true,
       'display_exceptions'        => true,
       'doctype'                   => 'HTML5',
),
...
namespace ApplicationController;
use ZendMvcControllerActionController,
      ZendViewModelViewModel;

class IndexController extends ActionController
{
      public function indexAction()
      {
            return new ViewModel();
      }
}
   Легко переносить модули:
     Скопировать в папку module (или vendor)
     Подключить модуль в application.config.php
     Скопировать конфиг модуля в
     /config/autoload/module.<name>.config.php
   Pyrus
   http://packages.zendframework.com/
   Install and configure pyrus:
    wget http://packages.zendframework.com/pyrus.phar
    pyrus.phar .
    pyrus.phar . channel-discover packages.zendframework.com

   Install a Zend_<component>:
    pyrus.phar . install zf2/Zend_<component>
   Переход с минимальной переписью кода
   Основные шаги
     Namespace: Zend_Foo => ZendFoo
     Exceptions: Zend_Exception больше нет
      (интерфейс для каждого компонента)
     Autoloading: 3 варианта (ZF1 включительно)
     MVC: модули, события
http://tiny.cc/5dw8ew
   2 марта 2012 – ZF2 beta 3 released
   22 мая 2012 – ZF2 beta 4 released
     Travis CI integration
     Composer support (http://packagist.org/)
   ZF2 beta 5?
   Релиз? «Начало лета»?
   http://framework.zend.com/zf2
   http://github.com/zendframework
   https://github.com/zendframework/ZendSkel
    etonApplication
   Getting Started with Zend Framework 2 by
    Rob Allen, http://www.akrabat.com
   Еженедельные IRC митинги
    (#zf2-meeting on Freenode)
   #zftalk.2 on Freenode IRC
•   Email: as@extrascript.com
•   Skype: aliaksandr.simanovich
•   Twitter: simanjan
•   Blog: simanovich.info
Zend framework 2

Zend framework 2

  • 1.
  • 3.
    Руководитель группы разработчиков MTV Entertainment в EPAM Systems  PHP Skill Manager в EPAM Systems
  • 4.
    Enrico Zimuel  ZF core developer  ZFConf 2012
  • 5.
    Обзор ZF2  Новая система Autoloading  Dependency Injection  Event manager  Новый MVC  Быстрый старт: ZendSkeletonApplication  Система пакетов (packages)  От ZF1 к ZF2
  • 7.
    Новая архитектура (MVC, DI, Events)  >= PHP 5.3  Отменен CLA (Contributor License Agreement)  Git (GitHub) вместо SVN  Улучшенная производительность  Модульность  Система пакетов (packages)
  • 8.
    Подход ZF1:  Singleton  Registry  Hard-Coded Dependencies  Подход ZF2:  Aspect Oriented Design  Dependency Injection
  • 9.
    Методологии  Уменьшение связанности кода (ZendDi)  Событийность (ZendEventManager)  Стандартные классы (ZendStdlib)  Используются возможности PHP 5.3  Namespace  Лямбда функции и замыкания  Лучшая производительность
  • 11.
    Никаких require_once  Множество подходов:  Стиль ZF1: include_path autoloader  Autoloading по префиксу или неймспейсу  Class-map autoloading
  • 12.
    Генерация .classmap.php из командной строки: bin/classmap_generator.php  Usage is trivial: $ cd your/library $ php /path/to/classmap_generator.php -w
  • 13.
    Class-Maps дают 25% прироста по сравнению ZF1 autoloader без акселерации, 60-80% прироста, если используется кэширование опкода  Связывание неймспейсов/префиксов с путем дает >10% прироста производительности без акселерации, 40% - с кэшированием опкода Note: новый autoloading доступен в ZF 1.12
  • 15.
    Как управлять зависимостями между объектами?  Dependency injection (DI) это шаблон проектирования, который снижает связанность между компонентами программы
  • 16.
    class Foo { protected $bar; … public function __construct() { $this->bar= new Bar(); } … }
  • 17.
    class Foo { protected $bar; … public function __construct(Bar $bar) { $this->bar = $bar; } … }
  • 18.
    class Foo { protected $bar; … public function setBar(Bar $bar) { $this->bar = $bar; } … }
  • 19.
    WITHOUT DI WITH DI (CONSTRUCT) Недостатки: Преимущества:  Сложно тестировать  Легко тестировать  Нет изоляции  Низкая связанность  Сложность повторного  Гибкая архитектура использования
  • 20.
    Поддерживает 3 типа инъекций:  Constructor  Interface  Setter  Реализует DI Container:  Управление зависимостями с помощью конфигураций и аннотаций
  • 21.
    $definition = array( 'Foo' => array( 'setBar' => array( 'bar' => array( 'type' => 'Bar', 'required' => true, ), ), ), );
  • 22.
    use ZendDiDi, ZendDiConfiguration; $di = new Di; $config = new Configuration(array( 'definition' => array( 'class' => $definition ) )); $config->configure($di); $foo = $di->get('Foo'); // contains Bar!
  • 23.
    namespace Example { use ZendDiDefinitionAnnotation as Di; class Foo { public $bar; /** * @DiInject() */ public function setBar(Bar $bar){ $this->bar = $bar; } } class Bar { } }
  • 24.
    $compiler = new ZendDiDefinitionCompilerDefinition(); $compiler->addDirectory('Filepath of Foo and Bar'); $compiler->compile(); $definitions = new ZendDiDefinitionList($compiler); $di = new ZendDiDi($definitions); $baz = $di->get('ExampleFoo'); // contains Bar!
  • 26.
    Event Manager – объект, агрегирующий слушателей для одного или нескольких событий, а также вызывающий события  Listener – callback, реагирующий на события – слушатель.  Event – это действие
  • 27.
    use ZendEventManagerEventManager; $events =new EventManager(); $events->attach('do', function($e) { $event = $e->getName(); $params = $e->getParams(); printf(‘Еvent “%s”, with parameters %s', $event, json_encode($params)); }); $params = array('foo' => 'bar', 'baz' => 'bat'); $events->trigger('do', null, $params);
  • 29.
    Bootstrap, route, dispatch, response…  В MVC ZF2 все является событием
  • 30.
    Базовый блок в ZF2 MVC приложении это модуль  Модуль это коллекция кода и других файлов, которые решают специфическую атомарную задачу большой бизнес задачи  Модуль это:  Namespace  Module.php
  • 32.
    Простой скелет приложения, использующий ZF2 MVC и модульную систему  Работает на ZF2.0.0beta4  Весь на код на GitHub, submodules… git clone –recursive git://github.com/zendframework/ZendSkeletonApplication.git
  • 35.
    ... 'router' => array( 'routes' => array( ... ), ), 'controller' => array( 'classes' => array( 'index' => 'ApplicationControllerIndexController' ), ), 'view_manager' => array( 'display_not_found_reason' => true, 'display_exceptions' => true, 'doctype' => 'HTML5', ), ...
  • 36.
    namespace ApplicationController; use ZendMvcControllerActionController, ZendViewModelViewModel; class IndexController extends ActionController { public function indexAction() { return new ViewModel(); } }
  • 37.
    Легко переносить модули:  Скопировать в папку module (или vendor)  Подключить модуль в application.config.php  Скопировать конфиг модуля в /config/autoload/module.<name>.config.php
  • 40.
    Pyrus  http://packages.zendframework.com/  Install and configure pyrus: wget http://packages.zendframework.com/pyrus.phar pyrus.phar . pyrus.phar . channel-discover packages.zendframework.com  Install a Zend_<component>: pyrus.phar . install zf2/Zend_<component>
  • 42.
    Переход с минимальной переписью кода  Основные шаги  Namespace: Zend_Foo => ZendFoo  Exceptions: Zend_Exception больше нет (интерфейс для каждого компонента)  Autoloading: 3 варианта (ZF1 включительно)  MVC: модули, события
  • 43.
  • 44.
    2 марта 2012 – ZF2 beta 3 released  22 мая 2012 – ZF2 beta 4 released  Travis CI integration  Composer support (http://packagist.org/)  ZF2 beta 5?  Релиз? «Начало лета»?
  • 45.
    http://framework.zend.com/zf2  http://github.com/zendframework  https://github.com/zendframework/ZendSkel etonApplication  Getting Started with Zend Framework 2 by Rob Allen, http://www.akrabat.com  Еженедельные IRC митинги (#zf2-meeting on Freenode)  #zftalk.2 on Freenode IRC
  • 46.
    Email: as@extrascript.com • Skype: aliaksandr.simanovich • Twitter: simanjan • Blog: simanovich.info