slego
Новичок
Польза и принцип работы Interception Filters
Всем привет.
Все надеялся, что тема Interception Filters (кстати, как все-таки правильней interceptiON
или interceptiNG?) меня обойдет стороной.... не обошла...
Вот. С первого взгляда, вроде как симпатичная и довольно-таки полезная штука.
Но со второго и с третьего возникают сомнения.
Ну, во-первых, варианты фильтров, которые я встречал:
1. ExecutingTimeFilter - время выполнения всего скрипта
2. AuthFilter - фильтр аутентификации
3. OutputBufferingFilter - чувствую, что жутко полезный фильтр,
но смысл никак не могу понять (использование функций ob_start,
ob_end_flash и т.д. Возможно, добрые люди объяснят на пальцах для ЧЕГО это надо?
Кеширование, или только для устранения проблем, связанных с преждевременной отсылкой headers?
Только к мануалу не отсылайте, пожалуйста).
4. LoggingFilter
5. DebugFilter
6. и т.д.
n. MainExecutionFilter - Основной фильтр, в котором реализуется логика приложения
(маппинг комманд, форварды, выбор вью и т.д. Много чего, короче).
Далее цепочка фильтров реализуется, как правило, на основе паттерна Decorator
(ну, или какой-нибудь его модификации). Где-то так:
Каждый фильтр имеет preProcess и postProcess методы для запуска до и после запуска
следующего фильтра. Ну или не имеет , а есть просто метод process().
Теперь, собственно, что меня смущает. Весь код - условный.
ПРИМЕР 1. Фильтр времени исполнения
Т.е. имеем некоторые данные (в частности, время выполнения), которые мы получаем
ПОСЛЕ того, как отработал основной фильтр, реализующий логику приложения, который
уже все, что он должен был, собрал и поместил в Response.
К тому же, мне почему-то казалось, что подобный фильтр нужен не столько для спортивного
интереса, сколько для того, чтобы при достижении максимального времени выполнения,
прерывать скрипт. Это как такое можно реализовать? Нужен, наверное, какой-нибудь
Observer или что там еще.
ПРИМЕР 2. Фильтр аутентификации:
Тут тоже ерунда какая-то получается. Мы даже не доходим до основной логики, а хорошо
было бы посмотреть маппинг-файл, поискать там
действие, которое отвечает за провал фильтра, опять подключить необходимое вью...
Некузяво как-то.
ПРИМЕР 3. Фильтр дебага или логирования.
Наш фильтр, получается, просто служит для "включения" опции, на которую будет ссылаться
остальной код
С одной стороны, красиво конечно, но стоит ли на включение одной опции
создавать целый объект?
Итак, как прокомментирует все это достопочтеннейшая публика?
В чем я заблуждаюсь и что пытаюсь делать категорически неправильно?
И стоит ли вообще таким заморачиваться?
На sitepont.com встречал мнение, что Interception Filters - это АНТИпаттерн для
php. Что он ориентирован на приложения, которые резидентно висят в памяти.
Загрузил все фильтры в самом начале работы приложения и все.
В случае php эти фильтры загружаются каждый раз... хотя тут еще много чего
каждый раз загружается
В общем, any critics, suggests and propositions are welcome.
Спасибо всем, кто таки осилил.
Всем привет.
Все надеялся, что тема Interception Filters (кстати, как все-таки правильней interceptiON
или interceptiNG?) меня обойдет стороной.... не обошла...
Вот. С первого взгляда, вроде как симпатичная и довольно-таки полезная штука.
Но со второго и с третьего возникают сомнения.
Ну, во-первых, варианты фильтров, которые я встречал:
1. ExecutingTimeFilter - время выполнения всего скрипта
2. AuthFilter - фильтр аутентификации
3. OutputBufferingFilter - чувствую, что жутко полезный фильтр,
но смысл никак не могу понять (использование функций ob_start,
ob_end_flash и т.д. Возможно, добрые люди объяснят на пальцах для ЧЕГО это надо?
Кеширование, или только для устранения проблем, связанных с преждевременной отсылкой headers?
Только к мануалу не отсылайте, пожалуйста).
4. LoggingFilter
5. DebugFilter
6. и т.д.
n. MainExecutionFilter - Основной фильтр, в котором реализуется логика приложения
(маппинг комманд, форварды, выбор вью и т.д. Много чего, короче).
Далее цепочка фильтров реализуется, как правило, на основе паттерна Decorator
(ну, или какой-нибудь его модификации). Где-то так:
PHP:
$fc = new ExecutionTimeFilter(new DebugFilter(new AuthFilter
(new SessionFilter(new MainExecutionFilter()));
$fc->process();
следующего фильтра. Ну или не имеет , а есть просто метод process().
Теперь, собственно, что меня смущает. Весь код - условный.
ПРИМЕР 1. Фильтр времени исполнения
PHP:
$fc = new ExecutionTimeFilter(new MainExecutionFilter());
$fc->process();
class ExecutionTimeFilter extends Filter
{
public function process()
{
$action = new Request::getAction();
$action->execute();
$view = new View($action->getData())
Response::setContent($view->render());
}
}
class ExecutionTimeFilter extends Filter
{
public function preProcess()
{
$this->_time = microtime();
}
public function postProcess()
{
return microtime() - $this->_time;
}
public function process()
{
$this->preProcess();
$this->next_filter->process();
$this->postProcess();
}
}
ПОСЛЕ того, как отработал основной фильтр, реализующий логику приложения, который
уже все, что он должен был, собрал и поместил в Response.
К тому же, мне почему-то казалось, что подобный фильтр нужен не столько для спортивного
интереса, сколько для того, чтобы при достижении максимального времени выполнения,
прерывать скрипт. Это как такое можно реализовать? Нужен, наверное, какой-нибудь
Observer или что там еще.
ПРИМЕР 2. Фильтр аутентификации:
PHP:
$fc = new AuthFilter(new MainExecutionFilter());
$fc->process();
class AuthFilter extends Filter
{
public function process()
{
if ($this->user->isAuth)
$this->next_filter->process();
else echo "хацкерам - НАЙН!";
//else exit();
}
}
было бы посмотреть маппинг-файл, поискать там
действие, которое отвечает за провал фильтра, опять подключить необходимое вью...
Некузяво как-то.
ПРИМЕР 3. Фильтр дебага или логирования.
Наш фильтр, получается, просто служит для "включения" опции, на которую будет ссылаться
остальной код
PHP:
$fc = new DebugFilter(new MainExecutionFilter());
$fc->process();
class DebugFilter extends Filter
{
public function process()
{
Application::setDebugMode("on");
$this->next_filter->process();
}
}
class ExecutionTimeFilter extends Filter
{
public function process()
{
//...
if (Application::getDebugMode == "on")
{
echo Request::getAction();
}
//...
}
}
создавать целый объект?
Итак, как прокомментирует все это достопочтеннейшая публика?
В чем я заблуждаюсь и что пытаюсь делать категорически неправильно?
И стоит ли вообще таким заморачиваться?
На sitepont.com встречал мнение, что Interception Filters - это АНТИпаттерн для
php. Что он ориентирован на приложения, которые резидентно висят в памяти.
Загрузил все фильтры в самом начале работы приложения и все.
В случае php эти фильтры загружаются каждый раз... хотя тут еще много чего
каждый раз загружается
В общем, any critics, suggests and propositions are welcome.
Спасибо всем, кто таки осилил.