====== Пакет FILTER_CHAIN ====== Пакет FILTER_CHAIN - это реализация паттерна [[http://java.sun.com/blueprints/corej2eepatterns/Patterns/InterceptingFilter.html|Intercepting Filter]], или Цепочка фильтров. Фильтры чаще всего используются для того, чтобы совершать предварительную или последующую иерархическую обработку запроса к системе, однако круг задач, где они могут быть пременены этим не ограничивается. В Limb цепочка фильтров также используется в качестве [[wp>FrontController]], то есть приложение, выполненное на базе Limb - начинается именно как цепочка фильтров (см. пакет WEB_APP). ===== UML диаграммы ===== ==== Статическая диаграмма классов ==== {{{:limb3:ru:packages:filter_chain:limb_3.x_filter_chain.png|:limb3:ru:packages:filter_chain:limb_3.x_filter_chain.png}}} То есть по сути пакет состоит из класса **%%lmbFilterChain%%** и интерфейса **%%lmbInterceptingFilter%%**. ==== Диаграмма последовательностей ==== {{{:limb3:ru:packages:filter_chain:limb_3.x_sequence.png|: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(); Также можно обратить внимание на то, что фильтры регистрируются как хендлы, которые становятся реальными объектами только тогда, когда до них доходит очередь. Подробнее о хендлах в разделе [[limb3:ru:packages:core:handles|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 } }