Использование middleware в php

Yoskaldyr

"Спамер"
Партнер клуба
На днях зарелизился zend-expressive в котором за основу взята идея middleware.
Знаю что middleware есть и в других фреймворках (например в том же ларавеле).

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

Sufir

Я не волшебник, я только учусь
— Не знал, что на небесах никуда без этого? Пойми, на небесах только и говорят, что о middleware. Как оно бесконечно прекрасно… О закате, который они видели… О том, как солнце, погружаясь в волны, стало алым как кровь. И почувствовали, что middleware впитало энергию светила в себя, и солнце было укрощено, и огонь уже догорал в глубине. А ты?.. Что ты им скажешь? Там наверху тебя окрестят лохом…
Присоединяюсь. В последнее время кругом только и слышу модный термин middleware, но что-то сходу не въеду в чём фишка.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Метод организации упорядоченного выполнения чего-либо просто. Префильтров, пострфильтров, авторизации, проверки CSRF токена и тыды.

PS: Я написал к ларавелу кусочек, чтобы он у меня проверял права доступа к ресурсу, типа ACL для админочки такой вышел. Удобно, быстро, говнокодно)
 

Adelf

Administrator
Команда форума
Да просто это промежуток между обработкой запроса фреймворком и контроллером. Самый распространенный - Auth. Т.е. ставим такой middleware всем тем частям сайта, которые доступны тоько залогиненным и там перенаправляем на страницу логина, если не залогинен. А в самих этих контроллерах - уже даже не заботимся о том авторизован юзер или нет
 

fixxxer

К.О.
Партнер клуба
Я бы это рассматривал не как middleware (дурацкий термин, в общем-то), а как chain of responsibility. Экшен контроллера просто последний. Собственно в laravel-е оно так и работает.
 

Adelf

Administrator
Команда форума
@fixxxer, вообще там было такое понятие как after-filter. И middleware тоже может после action что-то делать.
 

fixxxer

К.О.
Партнер клуба
А, ну да, точно, есть такое. Ни разу не надо было.

Ну - тем более :)
 

WMix

герр M:)ller
Партнер клуба
ну да, middleware это некий beforActionCallback на определенные routes. Зачем? Чтоб не повторять одно и тоже действие в controllers. Нет смысла вызывать пользовательские странички если нет пользователя. Для игр сразу вижу некий timeout фильтрацию, "погодите не спешите". Но и да, все можно решить с помощью throw new Exception и afterActionCallback. Мне первый вариант предпочтительней, меньше исключений, логика другая.
 

Yoskaldyr

"Спамер"
Партнер клуба
Тогда второй вопрос - а какой смысл делать фреймворк заточенный на это? Я имею ввиду zend-expressive
 

WMix

герр M:)ller
Партнер клуба
а нафига для rest затачивать?
Просто одно и тоже дейстие чтоб не повторять
 

AmdY

Пью пиво
Команда форума
Тогда второй вопрос - а какой смысл делать фреймворк заточенный на это? Я имею ввиду zend-expressive
наоборот, этот подход позволяет отвязаться от фреймворка. ты реализуешь определённый интерфейс и твой компонент можно встраивать в любой фреймворк.
смысл как раз в универсальности.
 

hell0w0rd

Продвинутый новичок
Миддлвары бывают разные. Например есть в node фреймворк express (connect). Там вообще все через миддлвары. С их помощью выполняется валидация, роутинг, определение geoip, авторизация и так далее.
Бывают, на мой взгляд, более интересные решения в контексте фреймворков для веба, где корневой компонент - роутер, а миддлвары можно выставлять до и после определенных путей (endpoint), или их групп.

Вообще если посмотреть на большинство программ, обрабатывающих данные, они все построены на этой концепции. Компиляторы, веб-фреймворки, линтеры, статические анализаторы. Получается очень маленькое ядро, вокруг которого можно накрутить все, что хочешь.

Вообще это очень старая концепция. Мы все ей пользуемся в терминале:
Код:
cat /var/log/syslog | grep CRON
 

hell0w0rd

Продвинутый новичок
И всегда неправильно
grep CRON /var/log/syslog

Напрашивается вопрос - нафига так извращаться?
почему не правильно? Есть возможность сделать двумя разными способами. Я еще иногда вот так делаю:
cat /something | grep foo | grep bar
Наверное это можно сделать лучше, проще, быстрее и тд. Но зачем?
 

AnrDaemon

Продвинутый новичок
Чего аргументировать, когда у тебя есть два способа решить задачу правильно, и один - неправильно?…
Почему обязательно надо выбрать неправильный?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@AnrDaemon, еще раз, аргументы за то, что неправильно писать множественные пайпы?
 

AnrDaemon

Продвинутый новичок
НЕправильно использовать cat, когда он не нужен. А не "неправильно использовать множественные пайпы".
Возможно, PHP код будет более понятен?
cat | grep
PHP:
while($row = fetch($db)) $result[] = $row;
foreach($result as $row) …;
 
Сверху