Александр Симанович
Руководитель группы разработчиков 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
Методологии
Уменьшение связанности кода (Zend\Di)
Событийность (Zend\EventManager)
Стандартные классы (Zend\Stdlib)
Используются возможности PHP 5.3
Namespace
Лямбда функции и замыкания
Лучшая производительность
Никаких require_once Множество подходов:
Стиль ZF1: include_path autoloader
Autoloading по префиксу или неймспейсу
Class-map autoloading
Генерация .classmap.php из командной строки:
Usage is trivial:
bin/classmap_generator.php
$ 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 Zend\Di\Di,
Zend\Di\Configuration;
$di = new Di;
$config = new Configuration(array(
'definition' => array(
'class' => $definition
)
));
$config->configure($di);
$foo = $di->get('Foo'); // contains Bar!
namespace Example {
use Zend\Di\Definition\Annotation as Di;
class Foo {
public $bar;
/**
* @Di\Inject()
*/
public function setBar(Bar $bar){
$this->bar = $bar;
}
}
class Bar {
}
}
$compiler = new
Zend\Di\Definition\CompilerDefinition();
$compiler->addDirectory('File path of Foo and Bar');
$compiler->compile();
$definitions = new Zend\Di\DefinitionList($compiler);
$di = new Zend\Di\Di($definitions);
$baz = $di->get('Example\Foo'); // contains Bar!
Event Manager – объект, агрегирующий слушателей для одного или нескольких событий, а также вызывающий события
Listener – callback, реагирующий на события – слушатель.
Event – это действие
use Zend\EventManager\EventManager;
$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' => 'Application\Controller\IndexController'
),
),
'view_manager' => array(
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
),
...
namespace Application\Controller;
use Zend\Mvc\Controller\ActionController,
Zend\View\Model\ViewModel;
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:
Install a Zend_<component>:
wget http://packages.zendframework.com/pyrus.phar
pyrus.phar .
pyrus.phar . channel-discover packages.zendframework.com
pyrus.phar . install zf2/Zend_<component>
Переход с минимальной переписью кода Основные шаги
Namespace: Zend_Foo => Zend\Foo
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: [email protected]
• Skype: aliaksandr.simanovich
• Twitter: simanjan
• Blog: simanovich.info