Zend framework 2

47
Александр Симанович

description

Slides from my presentation on PhpDevby (June 2012, Minsk). This slides are based on presentation of Enrico Zimuel on ZFConf 2012 in Moscow.

Transcript of Zend framework 2

Page 1: Zend framework 2

Александр Симанович

Page 2: Zend framework 2
Page 3: Zend framework 2

Руководитель группы разработчиков MTV Entertainment в EPAM Systems

PHP Skill Manager в EPAM Systems

Page 4: Zend framework 2

Enrico Zimuel

ZF core developer

ZFConf 2012

Page 5: Zend framework 2

Обзор ZF2 Новая система Autoloading Dependency Injection Event manager Новый MVC Быстрый старт: ZendSkeletonApplication Система пакетов (packages) От ZF1 к ZF2

Page 6: Zend framework 2
Page 7: Zend framework 2

Новая архитектура (MVC, DI, Events) >= PHP 5.3 Отменен CLA (Contributor License

Agreement) Git (GitHub) вместо SVN Улучшенная производительность Модульность Система пакетов (packages)

Page 8: Zend framework 2

Подход ZF1:

Singleton

Registry

Hard-Coded Dependencies

Подход ZF2:

Aspect Oriented Design

Dependency Injection

Page 9: Zend framework 2

Методологии

Уменьшение связанности кода (Zend\Di)

Событийность (Zend\EventManager)

Стандартные классы (Zend\Stdlib)

Используются возможности PHP 5.3

Namespace

Лямбда функции и замыкания

Лучшая производительность

Page 10: Zend framework 2
Page 11: Zend framework 2

Никаких require_once Множество подходов:

Стиль ZF1: include_path autoloader

Autoloading по префиксу или неймспейсу

Class-map autoloading

Page 12: Zend framework 2

Генерация .classmap.php из командной строки:

Usage is trivial:

bin/classmap_generator.php

$ cd your/library

$ php /path/to/classmap_generator.php -w

Page 13: Zend framework 2

Class-Maps дают 25% прироста по сравнению ZF1 autoloader без акселерации, 60-80% прироста, если используется кэширование опкода

Связывание неймспейсов/префиксов с путем дает >10% прироста производительности без акселерации, 40% - с кэшированием опкода

Note: новый autoloading доступен в ZF 1.12

Page 14: Zend framework 2
Page 15: Zend framework 2

Как управлять зависимостями между объектами?

Dependency injection (DI) это шаблон проектирования, который снижает связанность между компонентами программы

Page 16: Zend framework 2

class Foo {

protected $bar;

public function __construct() {

$this->bar= new Bar();

}

}

Page 17: Zend framework 2

class Foo {

protected $bar;

public function __construct(Bar $bar) {

$this->bar = $bar;

}

}

Page 18: Zend framework 2

class Foo {

protected $bar;

public function setBar(Bar $bar) {

$this->bar = $bar;

}

}

Page 19: Zend framework 2

WITHOUT DI

Недостатки: Сложно тестировать Нет изоляции Сложность повторного

использования

WITH DI (CONSTRUCT)

Преимущества: Легко тестировать Низкая связанность Гибкая архитектура

Page 20: Zend framework 2

Поддерживает 3 типа инъекций:

Constructor

Interface

Setter

Реализует DI Container:

Управление зависимостями с помощью конфигураций и аннотаций

Page 21: Zend framework 2

$definition = array(

'Foo' => array(

'setBar' => array(

'bar' => array(

'type' => 'Bar',

'required' => true,

),

),

),

);

Page 22: Zend framework 2

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!

Page 23: Zend framework 2

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 {

}

}

Page 24: Zend framework 2

$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!

Page 25: Zend framework 2
Page 26: Zend framework 2

Event Manager – объект, агрегирующий слушателей для одного или нескольких событий, а также вызывающий события

Listener – callback, реагирующий на события – слушатель.

Event – это действие

Page 27: Zend framework 2

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);

Page 28: Zend framework 2
Page 29: Zend framework 2

Bootstrap, route, dispatch, response… В MVC ZF2 все является событием

Page 30: Zend framework 2

Базовый блок в ZF2 MVC приложении это модуль

Модуль это коллекция кода и других файлов, которые решают специфическую атомарную задачу большой бизнес задачи

Модуль это:

Namespace

Module.php

Page 31: Zend framework 2
Page 32: Zend framework 2

Простой скелет приложения, использующий ZF2 MVC и модульную систему

Работает на ZF2.0.0beta4 Весь на код на GitHub, submodules…

git clone –recursive

git://github.com/zendframework/ZendSkeletonApplication.git

Page 33: Zend framework 2
Page 34: Zend framework 2
Page 35: Zend framework 2

...

'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',

),

...

Page 36: Zend framework 2

namespace Application\Controller;

use Zend\Mvc\Controller\ActionController,

Zend\View\Model\ViewModel;

class IndexController extends ActionController

{

public function indexAction()

{

return new ViewModel();

}

}

Page 37: Zend framework 2

Легко переносить модули:

Скопировать в папку \module (или \vendor)

Подключить модуль в application.config.php

Скопировать конфиг модуля в /config/autoload/module.<name>.config.php

Page 38: Zend framework 2
Page 39: Zend framework 2
Page 40: Zend framework 2

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>

Page 41: Zend framework 2
Page 42: Zend framework 2

Переход с минимальной переписью кода Основные шаги

Namespace: Zend_Foo => Zend\Foo

Exceptions: Zend_Exception больше нет (интерфейс для каждого компонента)

Autoloading: 3 варианта (ZF1 включительно)

MVC: модули, события

Page 44: Zend framework 2

2 марта 2012 – ZF2 beta 3 released 22 мая 2012 – ZF2 beta 4 released

Travis CI integration

Composer support (http://packagist.org/)

ZF2 beta 5? Релиз? «Начало лета»?

Page 45: Zend framework 2

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

Page 46: Zend framework 2

• Email: [email protected]

• Skype: aliaksandr.simanovich

• Twitter: simanjan

• Blog: simanovich.info

Page 47: Zend framework 2