Upload
alex-simanovich
View
1.300
Download
8
Embed Size (px)
DESCRIPTION
Slides from my presentation on PhpDevby (June 2012, Minsk). This slides are based on presentation of Enrico Zimuel on ZFConf 2012 in Moscow.
Citation preview
Александр Симанович
Руководитель группы разработчиков 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