Что несёт нам Zend Framework 2.0?   Надежда Блинова ,  веб-программист , Wizartech Георгий Туревич , ведущий веб-программи...
Планируемые изменения   <ul><li>Изменения в архитектуре </li></ul><ul><li>Изменения в  MVC </li></ul><ul><li>Изменения   в...
<ul><li>Пространства имен </li></ul><ul><li>__ invoke () </li></ul><ul><li>Замыкания </li></ul><ul><li>Goto </li></ul><ul>...
<ul><li>Унифицированный конструктор  </li></ul><ul><li>Стандартизация массива  Options </li></ul><ul><li>Исключения </li><...
Изменения в архитектуре Унифицированный конструктор public function  setOptions ( $options )  {    // ...       foreach ( ...
Изменения в архитектуре Унифицированный конструктор namespace  Z end ; // Новый, общий для всех класс  Options c  методом ...
Изменения в архитектуре Унифицированный конструктор namespace  Z end ;   class  Options   {       public static function  ...
Изменения в архитектуре Унифицированный конструктор use  Z end  Options  as  Options ;   class  Foo   {       public  $bar...
Изменения в архитектуре Унифицированный конструктор    $foo  = new  Foo (array( 'bar'  =>  'baz' ));   echo  $foo -> bar ;...
<ul><li>underscore_separated_keys  </li></ul><ul><li>camelCasedKeys  </li></ul><ul><li>UPPERCASEDKEYS  </li></ul><ul><li>l...
Изменения в архитектуре Exceptions.  Исключения // у каждого компонента должен быть свой интерфейс  Exception namespace  F...
<ul><li>Design By Contract </li></ul><ul><li>формальные, точные и верифицируемые интерфейсы </li></ul><ul><li>Минимальные ...
<ul><li>Почему стоит отказаться от синглтона: </li></ul><ul><li>Глобальное состояние усложняет разработку и тестирование <...
<ul><li>Plugins/Helpers/Strategies </li></ul><ul><li>Decorators </li></ul><ul><li>Factories </li></ul><ul><li>Caching </li...
<ul><li>__invoke()  </li></ul>Изменения в архитектуре Новые возможности  Php  5.3 в плагинах class  Example  {    public f...
<ul><li>C losures (Замыкания) </li></ul>Изменения в архитектуре Новые возможности  Php  5.3 в плагинах Нотация: function (...
<ul><li>Pros: </li></ul><ul><ul><li>Польза для фреймворка в целом и Zend_Controller   и Zend_Search_Lucene в частности </l...
<ul><li>Полезно при работе с конечными автоматами  (FSM - Finite State Machine)   </li></ul><ul><ul><li>парсерами </li></u...
<ul><li>Три стандартных типа: </li></ul><ul><li>Chains </li></ul><ul><li>(валидаторы, фильтры, декораторы) </li></ul><ul><...
<ul><li>Отсутствие единообразия имен  </li></ul><ul><li>Разнообразие вызовов: </li></ul><ul><ul><li>Action helpers:  direc...
<ul><li>Использование пространств имен </li></ul><ul><ul><li>$loader -> registerNamespace ( ' M y V alidators' );    </li>...
<ul><li>Предполагается, что  хэлперы будут всегда использовать __ invoke () </li></ul>Изменения в плагинах Рекомендации: и...
<ul><li>Пример использования: </li></ul>Изменения в плагинах Рекомендации: использование __ invoke() $ validator   = new  ...
<ul><li>Все адаптеры должны реализовывать интерфейс &quot;Configurable&quot;. </li></ul>Изменения в плагинах Рекомендации:...
<ul><li>Фабрики будут создавать объект адаптера и передавать ему опции. </li></ul>Изменения в плагинах Рекомендации:  реал...
<ul><li>Цепочки должны расширять один из классов компонента  pubsub : </li></ul><ul><ul><li>Provider </li></ul></ul><ul><u...
<ul><li>Model- V iew- C ontroller   </li></ul><ul><li>( MVC , «Модель-представление-поведение», «Модель-представление-конт...
<ul><li>Zend_Controller 2.0 </li></ul><ul><li>Zend_Controller_Router 2.0 </li></ul><ul><li>Zend_View 2.0 </li></ul><ul><li...
<ul><li>Цели рефакторинга: </li></ul><ul><li>После всех изменений компонент должен стать: </li></ul><ul><ul><li>небольшим ...
<ul><li>Две методики : </li></ul><ul><li>конечный автомат (FSM) </li></ul><ul><li>событийная модель (Event-driven model) <...
<ul><li>Реализация похожа на  dojo pubsub </li></ul><ul><li>PubSub == Publish/Subscribe , организация взаимодействий по по...
Zend_Controller 2.0 Event-driven Model: PubSub class  TestPubSub  {      public function  someFunction ( $message )      {...
Zend_Controller 2.0 Event-driven Model: PubSub $ someFunctionHandle = $ providerObject -> subscribe ( 'mvc.routing' ,  $cl...
Zend_Controller 2.0 Event-driven Model: PubSub someFunction:  Join the Dark Side!   another Function:  Join the Dark Side!...
<ul><li>Событийная модель:  </li></ul><ul><ul><li>Определяется 4 состояния : routing, dispatching, response, error </li></...
Zend_Controller 2.0 Event-driven model routing :       ...    dispatching :        $pubsub -> publishUntil ( $stateChanged...
Zend_Controller 2.0 Event-driven model // $stateChanged –  замыкание, проверяющее состояние события dispatching :       $e...
Zend_Controller 2.0 Event-driven model switchState :      switch ( $e -> getState ()) {          case  'routing' :        ...
<ul><li>Объект Request  </li></ul><ul><li>Объект Response  </li></ul><ul><li>Объект Renderer  </li></ul><ul><li>Объект Rou...
<ul><li>Плагины фронт контроллера подписываются только на нужные темы </li></ul><ul><li>Action helper broker  может быть в...
<ul><li>Сейчас по умолчанию не производится никакой фильтрации приходящих данных </li></ul><ul><li>Планируется добавить фи...
<ul><li>Передача ошибки поиска  action  из  _ _ call  в  noRouteAction () </li></ul><ul><li>Использование оверлоадинга для...
<ul><li>легкость </li></ul><ul><li>контрактное программирование </li></ul><ul><li>роутер будет работать с объектами запрос...
<ul><li>Используется реализация &quot;Horde Routes&quot; </li></ul><ul><li>Метод  getInstance () предполагается удалить </...
<ul><li>Поиск совпадений по дереву ( tree - matching ).  </li></ul><ul><li>В дереве ищется только одно совпадение.  </li><...
<ul><li>Из объекта  HTTP Request  будет создаваться уникальный ключ </li></ul><ul><li>Найденный результат сохранится.  </l...
<ul><li>Проблемы текущей реализации: </li></ul><ul><li>Одновременная реализация как логики Модели  (фильтрация, валидация,...
<ul><li>Изменение  form *() view  helpers  так, чтобы они могли принимать элементы или другие объекты  Zend _ Form   </li>...
<ul><li>Работать с декораторами можно, используя метод  PubSub filter (): </li></ul>Zend_ Form  2.0 Рекомендации :  исполь...
<ul><li>Использование PubSub как базы для цепочек фильтров и валидаторов позволит их присоединять и отсоединять. </li></ul...
<ul><li>Для полного разделения  View  и  Model  нужно доставать цепочки из формы для использования в модели – и наоборот: ...
<ul><li>Объектная структура: </li></ul>Zend_ Form  2.0 Z end  FilterChain :: __set_state (array(        &quot;foo&quot;  =...
Zend_ Form  2.0 Будет использоваться так: $chain -> isValid ( $values );   $value  =  $chain -> get ( $key );   $chain -> ...
<ul><li>Все классы форм могут определять свойство &quot; metadata &quot;, содержащее пары ключ/значение, и набор методов  ...
<ul><li>Сейчас все элементы  Zend _ Form  генерируют  id .  </li></ul><ul><li>Отмена генерации  id  решит целый ряд пробле...
<ul><li>Конфигурация :  создание цепочек из конфигурации больше не будет доступно. </li></ul><ul><li>Метаданные :  отдельн...
<ul><li>В  Zend Framework 1.x  компонент  Zend_ Session  является труднотестируемым. </li></ul><ul><li>Планируется: </li><...
<ul><li>Планируется: </li></ul><ul><ul><li>реализация компонента упростится   и станет гибче </li></ul></ul><ul><ul><li>до...
<ul><li>Список других элементов: </li></ul><ul><ul><li>Zend_ Http_Client  2.0 </li></ul></ul><ul><ul><li>Zend_ Soap  2.0 <...
<ul><li>GIT </li></ul><ul><li>ACL не накладывает ограничений. Каждый разработчик сможет создать локальную копию репозитори...
Стандарты кодирования Псевдонимы   пространств   имен use  Zend  P ubsub  Provider  as  Provider ;  Псевдонимы  (alias)  н...
<ul><li>Абстрактные классы </li></ul><ul><ul><li>имена абстрактных классов будут предваряться словом &quot; Abstract &quot...
<ul><li>Надежда Блинова :   [email_address] </li></ul><ul><li>Георгий Туревич:  georgy.turevich @wizartech.ru </li></ul>Во...
Upcoming SlideShare
Loading in …5
×

ZFConf 2010: What News Zend Framework 2.0 Brings to Us

8,569 views
8,500 views

Published on

0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,569
On SlideShare
0
From Embeds
0
Number of Embeds
1,245
Actions
Shares
0
Downloads
55
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

ZFConf 2010: What News Zend Framework 2.0 Brings to Us

  1. 1. Что несёт нам Zend Framework 2.0? Надежда Блинова , веб-программист , Wizartech Георгий Туревич , ведущий веб-программист , Wizartech 27 марта 2010 г. Санкт-Петербург
  2. 2. Планируемые изменения <ul><li>Изменения в архитектуре </li></ul><ul><li>Изменения в MVC </li></ul><ul><li>Изменения в стандартах кодирования </li></ul><ul><li>Изменения в прочих компонентах </li></ul>
  3. 3. <ul><li>Пространства имен </li></ul><ul><li>__ invoke () </li></ul><ul><li>Замыкания </li></ul><ul><li>Goto </li></ul><ul><li>Late Static Binding (LSB) </li></ul><ul><li>И др. </li></ul>Используемые новинки php 5.3
  4. 4. <ul><li>Унифицированный конструктор </li></ul><ul><li>Стандартизация массива Options </li></ul><ul><li>Исключения </li></ul><ul><li>Контрактное программирование </li></ul><ul><li>Уменьшение количества синглтонов </li></ul><ul><li>С оздание компонентов общего назначения </li></ul><ul><li>Новые возможности Php 5.3 в плагинах </li></ul><ul><li>Автозагрузка </li></ul><ul><li>Пространства имен </li></ul><ul><li>goto </li></ul><ul><li>Изменения в плагинах </li></ul>Изменения в архитектуре
  5. 5. Изменения в архитектуре Унифицированный конструктор public function  setOptions ( $options ) { // ...      foreach ( $options  as  $key  =>  $value ) {          $method  =  'set'  .  $key ;         if ( method_exists ( $this ,  $method )) {              $this -> $method ( $value );         }     }     return  $this ; } Во многих компонентах в методе setOptions часто встречается повторяющийся код:
  6. 6. Изменения в архитектуре Унифицированный конструктор namespace  Z end ; // Новый, общий для всех класс Options c методом setOptions   class  Options  {      public static function  setOptions ( $object , array  $options )      {          if (! is_object ( $object )) {              return;          }          foreach ( $options  as  $key  =>  $value ) {               $method  =  'set'  .  self :: _normalizeKey ( $key );              if ( method_exists ( $object ,  $method )) {                   $object -> $method ( $value );              }          }      }        public static function  setConstructorOptions ( $object ,  $options )      {     ...     }        protected static function  _normalizeKey ( $key )      {  ...     }  } 
  7. 7. Изменения в архитектуре Унифицированный конструктор namespace  Z end ;  class  Options  {      public static function  setOptions ( $object , array  $options )      {  ...   }        public static function  setConstructorOptions ( $object ,  $options )      {             if ( $options  instanceof  Zend_Config ) {               $options  =  $options -> toArray ();          }          if ( is_array ( $options )) {               self :: setOptions ( $object ,  $options );          }      }        protected static function  _normalizeKey ( $key )      {           $option  =  str_replace ( '_' ,  ' ' ,  strtolower ( $key ));           $option  =  str_replace ( ' ' ,  '' ,  ucwords ( $option ));          return  $option ;       }  } 
  8. 8. Изменения в архитектуре Унифицированный конструктор use  Z end Options  as  Options ;  class  Foo  {      public  $bar  =  '' ;      public  $baz  =  '' ;         public function  __construct ( $options  =  null )      {           Options :: setConstructorOptions ( $this ,  $options );      }      public function  setOptions (array  $options )      {           Options :: setOptions ( $this ,  $options );      }      public function  setBar ( $value )      {           $this -> bar  =  $value ;      }        public function  setBaz ( $value )      {           $this -> baz  =  $value ;      }  } 
  9. 9. Изменения в архитектуре Унифицированный конструктор   $foo  = new  Foo (array( 'bar'  =>  'baz' ));  echo  $foo -> bar ;  // &quot;baz&quot;    $foo -> setOptions (array( 'bar'  =>  'boo' ,  'baz'  =>  'bat' ));  echo  $foo -> bar  .  $foo -> baz ;  // &quot;boobat&quot; 
  10. 10. <ul><li>underscore_separated_keys </li></ul><ul><li>camelCasedKeys </li></ul><ul><li>UPPERCASEDKEYS </li></ul><ul><li>lowercasedkeys </li></ul><ul><li>all_lowercase_underscore_keys </li></ul>Переводим в camelCase : Изменения в архитектуре Стандартизация массива Options str_replace ( ' ' ,  '' ,  ucwords ( str_replace ( '_' ,  ' ' ,  $value )));
  11. 11. Изменения в архитектуре Exceptions. Исключения // у каждого компонента должен быть свой интерфейс Exception namespace  Foo Bar ;  interface  Exception  {  }    class  InvalidArgumentException       extends  InvalidArgumentException       implements  Exception  {  }    try {      throw new  InvalidArgumentException ();  } catch ( Foo Bar Exception $e ) {  } 
  12. 12. <ul><li>Design By Contract </li></ul><ul><li>формальные, точные и верифицируемые интерфейсы </li></ul><ul><li>Минимальные требования к компонентам будут вынесены в интерфейсы. </li></ul><ul><li>С интерфейсами будут предложены стандартные реализации </li></ul><ul><li>Разработчик сможет расширять стандартные и создавать кастомные реализации на основе интерфейса </li></ul>Изменения в архитектуре Контрактное программирование
  13. 13. <ul><li>Почему стоит отказаться от синглтона: </li></ul><ul><li>Глобальное состояние усложняет разработку и тестирование </li></ul><ul><li>Зависимость обычного класса от синглтона не видна в публичном контракте класса </li></ul><ul><li>Наличие синглтона понижает тестируемость приложения в целом и классов, которые используют синглтон, в частности </li></ul>Изменения в архитектуре Уменьшение количества синглтонов
  14. 14. <ul><li>Plugins/Helpers/Strategies </li></ul><ul><li>Decorators </li></ul><ul><li>Factories </li></ul><ul><li>Caching </li></ul>Изменения в архитектуре С оздание компонентов общего назначения Области дублирующегося кода будут вынесены в отдельные подключаемые файлы
  15. 15. <ul><li>__invoke() </li></ul>Изменения в архитектуре Новые возможности Php 5.3 в плагинах class  Example  {   public function  __invoke () {     echo  &quot;Hello World! &quot; ;   } } $foo  = new  Example ; $foo ();
  16. 16. <ul><li>C losures (Замыкания) </li></ul>Изменения в архитектуре Новые возможности Php 5.3 в плагинах Нотация: function ( $var ) use ( $outerVar1 ,  $outerVar2 , ...) {} Пример: function  outer ( $x )  //Определение внешней функции {    $y = 2 ;  //Локальная переменная внешней функции    $inner = function ( $a ) use ( $x ,  $y )  //Определение внутренней функции    {        $b = 4 ;  //Локальная переменная внутренней функции        $res = $x + $y + $a + $b ;       echo  $res ;  //Результат будет равен 10    };    $inner ( 3 );  //Вызов внутренней функции } outer ( 1 );
  17. 17. <ul><li>Pros: </li></ul><ul><ul><li>Польза для фреймворка в целом и Zend_Controller и Zend_Search_Lucene в частности </li></ul></ul><ul><ul><li>Создание отдельного пространства для unit тестирования: T est Z end, Z end T est, или Z end T est </li></ul></ul><ul><li>Cons </li></ul><ul><ul><li>Глобальное переписывание кода </li></ul></ul>Изменения в архитектуре Пространства имен
  18. 18. <ul><li>Полезно при работе с конечными автоматами (FSM - Finite State Machine) </li></ul><ul><ul><li>парсерами </li></ul></ul><ul><ul><li>синтаксическими / лексическими анализаторами </li></ul></ul><ul><li>Компоненты: </li></ul><ul><ul><li>Zend_Controller_Front </li></ul></ul><ul><ul><li>Zend _ Ical </li></ul></ul><ul><ul><li>Zend_Search_Lucene </li></ul></ul><ul><ul><li>Zend_Markup </li></ul></ul><ul><ul><li>… </li></ul></ul>Изменения в архитектуре Использование goto
  19. 19. <ul><li>Три стандартных типа: </li></ul><ul><li>Chains </li></ul><ul><li>(валидаторы, фильтры, декораторы) </li></ul><ul><li>Helpers </li></ul><ul><li>( action helpers, view helpers ) </li></ul><ul><li>Adapters </li></ul><ul><li>(form display groups, subforms и элементы ; database adapters; translation adapters и др. ) </li></ul>Изменения в плагинах
  20. 20. <ul><li>Отсутствие единообразия имен </li></ul><ul><li>Разнообразие вызовов: </li></ul><ul><ul><li>Action helpers: direct() </li></ul></ul><ul><ul><li>View helpers: formSelect() ( имя класса ) </li></ul></ul><ul><ul><li>Validators: isValid () </li></ul></ul><ul><ul><li>Filters: filter() </li></ul></ul><ul><li>Снижение производительности: PluginLoader производит лишние операции при каждом поиске. </li></ul><ul><li>Нет единой парадигмы для конструкторов и/или конфигураций адаптеров </li></ul><ul><li>Нет единой парадигмы для передачи информации фабрикам </li></ul>Изменения в плагинах Проблемы с плагинами
  21. 21. <ul><li>Использование пространств имен </li></ul><ul><ul><li>$loader -> registerNamespace ( ' M y V alidators' );   </li></ul></ul><ul><ul><li>$class  =  $loader -> load ( 'foo' );   // M y V alidatorsFoo  </li></ul></ul><ul><ul><li>un / registerNamespace () вместо addPrefixPath () </li></ul></ul><ul><ul><li>class_exists() </li></ul></ul><ul><li>Использование имен-через-дефис-в-нижнем-регистре </li></ul><ul><ul><li>$loader -> registerNamespace ( ' M y V alidators' );   </li></ul></ul><ul><ul><li>$class  =  $loader -> load ( 'foo -bar ' );   </li></ul></ul><ul><ul><li>// M y V alidatorsFoo Bar </li></ul></ul><ul><li>Игнорирование нижнего подчеркивания поиском плагинов </li></ul>Изменения в плагинах Рекомендации: именование плагинов
  22. 22. <ul><li>Предполагается, что хэлперы будут всегда использовать __ invoke () </li></ul>Изменения в плагинах Рекомендации: использование __ invoke() При необходимости __ invoke () должен переадресовывать на другой метод interface  Validator  {  public function  isValid ( $value ,  $context  =  null );  public function  __invoke ( $value ,  $context  =  null );  } class  FooValidator  implements  Validator  {  public function  isValid ( $value ,  $context  =  null )  {       // ...  }      public function  __invoke ( $value ,  $context  =  null )  {       return  $this -> isValid ( $value ,  $context );  }  }
  23. 23. <ul><li>Пример использования: </li></ul>Изменения в плагинах Рекомендации: использование __ invoke() $ validator   = new  M y F oo Validator ();  // новый вызов if ( $ validator ( $value ) ) {} // аналогично старому вызову if ( $ validator->isValid($value) ) {}
  24. 24. <ul><li>Все адаптеры должны реализовывать интерфейс &quot;Configurable&quot;. </li></ul>Изменения в плагинах Рекомендации: реализация интерфейса Configurable interface  ConfigurableInterface  {  public function  setOptions ( $options );  }  class  Adapter  implements  ConfigurableInterface  {  public function  setOptions ( $options )  {       // ... настраиваем объект ...  }  } 
  25. 25. <ul><li>Фабрики будут создавать объект адаптера и передавать ему опции. </li></ul>Изменения в плагинах Рекомендации: реализация интерфейса Configurable class  ValidatorFactory  {      public static function  factory ( $options )      {          if ( $options instance of  Z end Config ) {               $options  =  $options -> toArray ();          }           if (! is_array ( $options )) {              throw new  InvalidArgumentException ();          }           $adapter  = new  $options [ 'type' ];           $adapter -> setOptions ( $options [ 'params' ]);          return  $adapter ;      }  } Фабрики должны иметь связанный с ними загрузчик плагинов и позволять подключать другие загрузчики.
  26. 26. <ul><li>Цепочки должны расширять один из классов компонента pubsub : </li></ul><ul><ul><li>Provider </li></ul></ul><ul><ul><li>FilterChain </li></ul></ul><ul><li>Построение стандартных цепочек везде, где это доступно, например, в декораторах </li></ul><ul><li>Расширение цепочек и добавление подклассов к объектам, которые их подключают </li></ul><ul><li>Цепочки должны вести себя как загрузчики плагинов, либо подключать загрузчики плагинов </li></ul>Изменения в плагинах Рекомендации: цепочки ( Chains )
  27. 27. <ul><li>Model- V iew- C ontroller </li></ul><ul><li>( MVC , «Модель-представление-поведение», «Модель-представление-контроллер») — архитектура программного обеспечения . </li></ul><ul><li>Шаблон MVC позволяет разделить данные, представление и обработку действий пользователя на три отдельных компонента </li></ul><ul><ul><li>Модель (Model) </li></ul></ul><ul><ul><ul><li>Модель предоставляет данные и реагирует на запросы, изменяя свое состояние. </li></ul></ul></ul><ul><ul><li>Представление (View) </li></ul></ul><ul><ul><ul><li>Отвечает за отображение информации (пользовательский интерфейс). </li></ul></ul></ul><ul><ul><li>Поведение (Controller) </li></ul></ul><ul><ul><ul><li>Интерпретирует данные, введенные пользователем, и информирует модель и представление о необходимости соответствующей реакции. </li></ul></ul></ul>Новая реализация MVC
  28. 28. <ul><li>Zend_Controller 2.0 </li></ul><ul><li>Zend_Controller_Router 2.0 </li></ul><ul><li>Zend_View 2.0 </li></ul><ul><li>Zend_Session 2.0 </li></ul><ul><li>Zend_Form 2.0 </li></ul>Новая реализация MVC
  29. 29. <ul><li>Цели рефакторинга: </li></ul><ul><li>После всех изменений компонент должен стать: </li></ul><ul><ul><li>небольшим </li></ul></ul><ul><ul><li>гибким </li></ul></ul><ul><ul><li>свободно расширяемым </li></ul></ul><ul><ul><li>легким в создании и использовании кастомных реализаций </li></ul></ul>Zend_Controller 2.0
  30. 30. <ul><li>Две методики : </li></ul><ul><li>конечный автомат (FSM) </li></ul><ul><li>событийная модель (Event-driven model) </li></ul>Zend_Controller 2.0
  31. 31. <ul><li>Реализация похожа на dojo pubsub </li></ul><ul><li>PubSub == Publish/Subscribe , организация взаимодействий по подписке </li></ul><ul><li>Основные методы: </li></ul><ul><ul><li>publish() </li></ul></ul><ul><ul><li>subscribe() </li></ul></ul>Zend_Controller 2.0 Event-driven Model: PubSub
  32. 32. Zend_Controller 2.0 Event-driven Model: PubSub class  TestPubSub {     public function  someFunction ( $message )     {         echo( 'someFunction: '  .  $message );     }          public function  anotherFunction ( $message )     {         echo( 'anotherFunction: '  .  $message );     }     } $classObject  = new  TestPubSub (); $providerObject  = new  Provider (); $outerFunction  = function ( $message ) {     echo( 'outerFunction: '  .  $message ); }; 
  33. 33. Zend_Controller 2.0 Event-driven Model: PubSub $ someFunctionHandle = $ providerObject -> subscribe ( 'mvc.routing' ,  $classObject ,  'someFunction' ); $ anotherFunctionHandle = $ providerObject -> subscribe ( 'mvc.routing' ,  $classObject ,  'anotherFunction' ); $ outerFunctionHandle = $ providerObject -> subscribe ( 'mvc.routing' ,  $outerFunction ); $providerObject -> publish ( 'mvc.routing' ,  'Join the Dark Side!' ); $providerObject -> publish ( 'mvc.routing' ,  'We have cookies!' ); $providerObject -> unsubscribe ( $ someFunctionHandle ); echo( '--- Производим unsubscribe функции someFunction ---' ); $providerObject -> publish ( 'mvc.routing' ,  'Join the Dark Side!' ); $providerObject -> publish ( 'mvc.routing' ,  'We have cookies!' );
  34. 34. Zend_Controller 2.0 Event-driven Model: PubSub someFunction:  Join the Dark Side! another Function:  Join the Dark Side! outer Function:  Join the Dark Side! someFunction:  We have cookies! another Function:  We have cookies! outer Function:  We have cookies! --- Производим unsubscribe функции someFunction --- another Function:  Join the Dark Side! outer Function:  Join the Dark Side! another Function:  We have cookies! outer Function:  We have cookies!
  35. 35. <ul><li>Событийная модель: </li></ul><ul><ul><li>Определяется 4 состояния : routing, dispatching, response, error </li></ul></ul><ul><ul><li>Методам передается событие ( Event ) </li></ul></ul><ul><ul><li>Методы изменяют состояние события </li></ul></ul><ul><ul><li>Вызывающий метод проверяет состояние и реагирует на изменение. </li></ul></ul>Zend_Controller 2.0 Event-driven model
  36. 36. Zend_Controller 2.0 Event-driven model routing :      ...   dispatching :       $pubsub -> publishUntil ( $stateChanged ,  'mvc.dispatching.pre' ,  $e );       $pubsub -> publishUntil ( $stateChanged ,  'mvc.dispatching' ,  $e );       $pubsub -> publishUntil ( $stateChanged ,  'mvc.dispatching.post' ,  $e );       $e -> setState ( 'response' );    response :      ...   error :       $pubsub -> publishUntil ( $stateChanged ,  'mvc.error' ,  $e );  Определяется 4 состояния :
  37. 37. Zend_Controller 2.0 Event-driven model // $stateChanged – замыкание, проверяющее состояние события dispatching :      $e -> markState ();      $pubsub -> publishUntil ( $stateChanged ,  'mvc.dispatching.pre' ,  $e );     if ( $e -> isStateChanged ()) {         goto  switchState ;     }      $pubsub -> publishUntil ( $stateChanged ,  'mvc.dispatching' ,  $e );     if ( $e -> isStateChanged ()) {         goto  switchState ;     }      $pubsub -> publishUntil ( $stateChanged ,  'mvc.dispatching.post' ,  $e );     if ( $e -> isStateChanged ()) {         goto  switchState ;     }      $e -> setState ( 'response' );
  38. 38. Zend_Controller 2.0 Event-driven model switchState :     switch ( $e -> getState ()) {         case  'routing' :             goto  routing ;         case  'dispatching' :             goto  dispatching ;         case  'response' :             goto  response ;         case  'error' :             goto  error ;         default:             throw new  StateException ();     }  
  39. 39. <ul><li>Объект Request </li></ul><ul><li>Объект Response </li></ul><ul><li>Объект Renderer </li></ul><ul><li>Объект Router </li></ul><ul><li>Объект Dispatcher </li></ul><ul><li>Action controllers </li></ul><ul><li>Объект ErrorHandler </li></ul>Zend_Controller 2.0 Дополнительные компоненты
  40. 40. <ul><li>Плагины фронт контроллера подписываются только на нужные темы </li></ul><ul><li>Action helper broker может быть встроен в объект Event </li></ul><ul><li>Объект View станет зависимым от рендерера, который, в свою очередь, подчинен объекту Responce . </li></ul><ul><li>Остается возможность внедрить собственные реализации </li></ul><ul><li>Достигается большой выигрыш производительности </li></ul>Zend_Controller 2.0 Последствия
  41. 41. <ul><li>Сейчас по умолчанию не производится никакой фильтрации приходящих данных </li></ul><ul><li>Планируется добавить фильтрацию / валидацию по умолчанию для суперглобальных массивов </li></ul><ul><li>К суперглобальным массивам без фильтрации обращаться через методы getRaw*() </li></ul>Zend_Controller 2.0 Poka Yoke фильтрация
  42. 42. <ul><li>Передача ошибки поиска action из _ _ call в noRouteAction () </li></ul><ul><li>Использование оверлоадинга для доступа к action helpers: __call() будет изменен . </li></ul>Zend_Controller 2.0 Список изменений в Action Controller //вызов через HelperBroker     $this -> _helper -> redirector ( 'index' );  //превратится в $this -> redirector ( 'index' );  //доступ к свойствам $this -> _helper -> viewRenderer -> setNoRender ( true );  //станет таким $this -> viewRenderer -> setNoRender ( true ); 
  43. 43. <ul><li>легкость </li></ul><ul><li>контрактное программирование </li></ul><ul><li>роутер будет работать с объектами запросов </li></ul><ul><li>будут исправлены те ошибки, которые сложно исправить без нарушения обратной совместимости </li></ul>Zend_Controller_ Router 2.0
  44. 44. <ul><li>Используется реализация &quot;Horde Routes&quot; </li></ul><ul><li>Метод getInstance () предполагается удалить </li></ul><ul><li>getDefault () и getDefaults () могут стать методами интерфейса </li></ul><ul><li>Метод match () будет принимать только объект Zend Controller Request Http </li></ul><ul><li>Построение маршрутов через конфиг </li></ul><ul><li>Цепочки </li></ul><ul><li>Маршрут Hostname </li></ul><ul><li>Поддержка кэширования </li></ul>Zend_Controller_ Router 2.0 Изменения в маршрутах
  45. 45. <ul><li>Поиск совпадений по дереву ( tree - matching ). </li></ul><ul><li>В дереве ищется только одно совпадение. </li></ul><ul><li>Достаточно всего раз отыскать имя хоста вместо поиска его для каждого нового маршрута. </li></ul>Zend_Controller_ Router 2.0 Chains
  46. 46. <ul><li>Из объекта HTTP Request будет создаваться уникальный ключ </li></ul><ul><li>Найденный результат сохранится. </li></ul><ul><li>Каждый отдельный маршрут будет достаточно найти единожды. </li></ul>Zend_Controller_ Router 2.0 Поддержка кэширования
  47. 47. <ul><li>Проблемы текущей реализации: </li></ul><ul><li>Одновременная реализация как логики Модели (фильтрация, валидация, метаданные) , так и логики Вида (рендеринг, декораторы) </li></ul><ul><li>Использование объектов формы для валидации </li></ul><ul><li>Неоднозначная реализация системы декораторов </li></ul>Zend_ Form 2.0
  48. 48. <ul><li>Изменение form *() view helpers так, чтобы они могли принимать элементы или другие объекты Zend _ Form </li></ul>Zend_ Form 2.0 Рекомендации: рефакторинг view helpers Zend_ Form 2.0 $element -> setOptions (array(       'size'       =>  25 ,       'maxlength'  =>  140 ,       'class'      =>  'form-text' ,  ));  echo  $view -> formText ( $element ); 
  49. 49. <ul><li>Работать с декораторами можно, используя метод PubSub filter (): </li></ul>Zend_ Form 2.0 Рекомендации : использование PubSub Будут предложены готовые цепочки: // Учитывая, что  Z end F ormDecoratorChain  // наследует  P ubsubFilterChain // и что render() переадресует на filter():  $chain  = new  Z end F orm DecoratorChain ();  $chain -> subscribe ( ' Z end F ormdecoratorLabel' );  $chain -> subscribe ( ' Z end F ormdecoratorViewHelper' );  $chain -> subscribe ( ' M y D ecoratorDiv' );  $chain -> setView ( $view );  echo  $chain -> render ( $element );  $chain  = new  Z end F orm D ecorator DefinitionListChain ;  $chain -> setView ( $view );  echo  $chain -> render ( $element );
  50. 50. <ul><li>Использование PubSub как базы для цепочек фильтров и валидаторов позволит их присоединять и отсоединять. </li></ul>Zend_ Form 2.0 Рекомендации : использование PubSub $vChain  = new  Z end V alidator ValidatorChain ();  $vChain -> subscribe ( 'Int' );  $vChain -> subscribe ( 'MinLength' , array( 3 ));  $vChain -> subscribe ( 'MaxLength' , array( 20 ));  // прекращение валидации на первой ошибке подписчика $vChain -> breakOnFailure ( true );   $element -> setValidatorChain ( $vChain ); if ( $element -> isValid ( $values )) { … }     $fChain  = new  Z end F ilter FilterChain ();  $fChain -> subscribe ( 'StringTrim' );  $element -> setFilterChain ( $fChain );  $newValues = $elemen -> filter ( $values );
  51. 51. <ul><li>Для полного разделения View и Model нужно доставать цепочки из формы для использования в модели – и наоборот: </li></ul>Zend_ Form 2.0 // Извлекаем ранее созданные цепочки фильтров и валидаторов  // всех элементов формы  $filterChain  =  $form -> getFilterChain ();    // Присоединяем к модели:   $model -> setFilterChain ( $filterChain );  Рекомендации: работа с цепочками фильтров и валидаторов
  52. 52. <ul><li>Объектная структура: </li></ul>Zend_ Form 2.0 Z end FilterChain :: __set_state (array(       &quot;foo&quot;  =>  Z end F ilter C hain Element :: __set_state (array(           'filterChain'  =>  Z end F ilter FilterChain (array(               '_subscribers => array(                  ' StrimTrim ',              ),          )),          ' validatorChain ' =>  Z end F ilterValidatorChain(array(              ' _subscribers  => array(                  array( 'Int' ),                  array( 'MinLength' , array( 3 )),                  array( 'MaxLength' , array( 25 )),              ),          )),      )),  ))  Рекомендации: работа с цепочками фильтров и валидаторов
  53. 53. Zend_ Form 2.0 Будет использоваться так: $chain -> isValid ( $values );  $value  =  $chain -> get ( $key );  $chain -> set ( $key ,  $value );  $chain -> setAll ( $values );  $elementChain  =  $chain -> getChain ( $key );  Рекомендации: работа с цепочками фильтров и валидаторов
  54. 54. <ul><li>Все классы форм могут определять свойство &quot; metadata &quot;, содержащее пары ключ/значение, и набор методов set / get для метаданных </li></ul>Zend_ Form 2.0 Рекомендации: разделение между метаданными и поведением $form -> setMetadata (array(       'action'  =>  $url ,       'method'  =>  'post' ,       'id'      =>  'registration' ,  ));    $element -> setMetadata (array(       'class'      =>  'form-text' ,       'size'       =>  25 ,       'maxlength'  =>  140 ,  ));  $element -> setName ( 'foo' ); 
  55. 55. <ul><li>Сейчас все элементы Zend _ Form генерируют id . </li></ul><ul><li>Отмена генерации id решит целый ряд проблем с UI . </li></ul><ul><li>Перевод можно перенести в слой view . </li></ul><ul><li>Цепочки View и Decorators будут получать объект Translator . </li></ul>Zend_ Form 2.0 Рекомендации: отмена установки id , перевод
  56. 56. <ul><li>Конфигурация : создание цепочек из конфигурации больше не будет доступно. </li></ul><ul><li>Метаданные : отдельный контейнер &quot; metadata &quot; может повлечь проблемы с уже существующими конфигурациями. </li></ul><ul><li>Удаление ID : Удаление генерации id может повлечь за собой проблемы с UI . Эта особенность, возможно, будет конфигурируемой. </li></ul>Zend_ Form 2.0 Проблемы обратной совместимости
  57. 57. <ul><li>В Zend Framework 1.x компонент Zend_ Session является труднотестируемым. </li></ul><ul><li>Планируется: </li></ul><ul><ul><li>сделать Zend_ Session более тестируемым </li></ul></ul><ul><ul><li>добавить возможность инъекции массива сессии </li></ul></ul><ul><ul><li>Zend_ Session больше не будет синглтоном </li></ul></ul>Zend_ Session 2.0
  58. 58. <ul><li>Планируется: </li></ul><ul><ul><li>реализация компонента упростится и станет гибче </li></ul></ul><ul><ul><li>добавятся брокеры для управления фильтрами и хэлперами </li></ul></ul><ul><ul><li>благодаря изменениям в MVC переменные будут передаваться во view script по токену </li></ul></ul>Zend_ View 2.0
  59. 59. <ul><li>Список других элементов: </li></ul><ul><ul><li>Zend_ Http_Client 2.0 </li></ul></ul><ul><ul><li>Zend_ Soap 2.0 </li></ul></ul><ul><ul><li>Zend_ Mail 2.0 </li></ul></ul><ul><li>Планируется улучшить, переработать или внести улучшения / исправления багов, требующие BC breaks </li></ul><ul><li>Подробнее: http://framework.zend.com/wiki/display/ZFDEV2/Home </li></ul>Другие элементы
  60. 60. <ul><li>GIT </li></ul><ul><li>ACL не накладывает ограничений. Каждый разработчик сможет создать локальную копию репозитория </li></ul><ul><li>Требования к пропускной способности и объему хранилища ниже </li></ul><ul><li>Упрощается разделение на ветки </li></ul><ul><li>Возможность организовать рабочие процессы, отличающиеся от рабочих процессов SVN </li></ul>GIT вместо Subversion
  61. 61. Стандарты кодирования Псевдонимы пространств имен use  Zend P ubsub Provider  as  Provider ; Псевдонимы (alias) назначаются при использовании &quot; use &quot; : <ul><li>Шаблоны: </li></ul><ul><li>Делая псевдонимом последнюю часть пространства имен, можно просто не использовать нотацию &quot; as Something &quot; </li></ul>use   Zend Filter ;  // Псевдонимом будет &quot;Filter&quot;  use  Zend Form Element ;  // Псевдонимом будет &quot;Element&quot;  <ul><li>Псевдоним для класса: </li></ul><ul><ul><li>или использовать имя класса </li></ul></ul><ul><ul><li>или подставлять суффиксом пространство имен класса </li></ul></ul>// Псевдоним &quot;HelperBroker&quot; use   Zend Controller Action HelperBroker ;   // Добавляя суффикс use  Zend Filter Int  as  IntFilter ;          
  62. 62. <ul><li>Абстрактные классы </li></ul><ul><ul><li>имена абстрактных классов будут предваряться словом &quot; Abstract &quot; : AbstractController , AbstractForm , и т.п. </li></ul></ul><ul><li>Интерфейсы </li></ul><ul><ul><li>должны именоваться описательно и достаточно обобщенно </li></ul></ul><ul><ul><li>не должны конфликтовать </li></ul></ul><ul><ul><li>должны четко указывать на задачи интерфейса </li></ul></ul><ul><ul><ul><li>Configurable </li></ul></ul></ul><ul><ul><ul><li>Adaptable </li></ul></ul></ul><ul><ul><ul><li>Resource </li></ul></ul></ul><ul><ul><ul><li>Role </li></ul></ul></ul><ul><ul><ul><li>Loadable </li></ul></ul></ul><ul><ul><ul><li>Builder </li></ul></ul></ul><ul><li>Указания типов </li></ul><ul><ul><li>должны использовать доступные псевдонимы везде, где возможно </li></ul></ul><ul><ul><li>если имя класса появляется в области видимости всего раз, ему тоже рекомендуется задать псевдоним </li></ul></ul>Стандарты кодирования
  63. 63. <ul><li>Надежда Блинова : [email_address] </li></ul><ul><li>Георгий Туревич: georgy.turevich @wizartech.ru </li></ul>Вопросы?

×