Инструменты пользователя

Инструменты сайта


limb3:ru:packages:filter_chain

Пакет FILTER_CHAIN

Пакет FILTER_CHAIN - это реализация паттерна Intercepting Filter, или Цепочка фильтров. Фильтры чаще всего используются для того, чтобы совершать предварительную или последующую иерархическую обработку запроса к системе, однако круг задач, где они могут быть пременены этим не ограничивается. В Limb цепочка фильтров также используется в качестве FrontController, то есть приложение, выполненное на базе Limb - начинается именно как цепочка фильтров (см. пакет WEB_APP).

UML диаграммы

Статическая диаграмма классов

:limb3:ru:packages:filter_chain:limb_3.x_filter_chain.png}

То есть по сути пакет состоит из класса lmbFilterChain и интерфейса lmbInterceptingFilter.

Диаграмма последовательностей

:limb3:ru:packages:filter_chain:limb_3.x_sequence.png}

Составление главной цепочки фильтров приложения

Использование фильтров в качестве, например, FrontController позволяет сконцентрировать управление логикой приложения в одном месте. Зачастую ваше приложение будет по сути представлять из себя обычную цепочку фильтров, а его работа будет заключаться в проходе по этой цепочке фильтров. Ваш index.php файл будет выглядеть приблизительно так:

$chain = new lmbFilterChain();
$chain->registerFilter(new lmbHandle('path_to_filter_1'));
$chain->registerFilter(new lmbHandle('path_to_filter_2'));
$chain->process(); 

Также можно обратить внимание на то, что фильтры регистрируются как хендлы, которые становятся реальными объектами только тогда, когда до них доходит очередь. Подробнее о хендлах в разделе lmbHandle. Это позволяет экономить на парсинге кода, если очередь до определенных фильтров так и не дойдет, например, при полностраничном кешировании.

Конечная конфигурация вашей цепочки сильно зависит от того, насколько сложное приложение вы делаете.

Сама цепочка фильтров похожа на «матрешку»:

   +-filter1
   |
   | +-filter2
   | | 
   | | +-filter3
   | | |
   | | |_
   | | 
   | |_
   |
   |_

Каждый фильтр самостоятельно решает, передавать ли контроль следующему фильтру или нет. Например, тело некоторого фильтра может выглядеть приблизительно так:

lmb_require(LPKG_FILTER_CHAIN_DIR . '/src/lmbInterceptingFilter.interface.php');
 
class SimpleInterceptingFilter implements lmbInterceptingFilter
{       
  function run($filter_chain)
  { 
    //pre processing is done here
 
    if ($this->someConditionPassed())
      $filter_chain->next();    
 
    //post processing is done here
  }      
} 

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
   ____   __    __ __   __ __   ____
  / __/  / /   / //_/  / // /  / __/
 / _/   / /__ / ,<    / _  /  / _/  
/_/    /____//_/|_|  /_//_/  /_/
 
limb3/ru/packages/filter_chain.txt · Последние изменения: 2010/11/10 10:02 (внешнее изменение)