Я пытаюсь понять, как работает промежуточное ПО в Laravel 5. Я посмотрел интерфейс Middleware и понял, что должен реализовать класс, который имеет метод «handle». В методе «handle» вызывается закрытие. Но я не понимаю, что прошло в закрытии. Какой класс будет вызывать мое промежуточное ПО? Как это работает под капотом? Может быть, это похоже на «foreach», и все Middlewares будут вызваны по очереди? UPDATE: Я пытаюсь реализовать свое собственное промежуточное ПО:
interface Middleware { public function handle($request, Closure $next); } class MiddlewareCollection { private $middlewares; private $request; public function __construct(Array $middlewares, $request) { $this->middlewares = $middlewares; $this->request = $request; } public function run() { $this->next(current($this->middlewares), $this->request); } private function next(Middleware $middleware, $request) { $middleware->handle($request, function($request) { //How can I call the next middleware? }); } } class FirstMiddleware implements Middleware { public function handle($request, Closure $next) { echo $request.'first '; return $next($request); } } class SecondMiddleware implements Middleware { public function handle($request, Closure $next) { echo $request.'second '; return $next($request); } } class ThirdMiddleware implements Middleware { public function handle($request, Closure $next) { echo $request.'third '; return $next($request); } } $middlewares = [ 'first' => new FirstMiddleware(), 'second' => new SecondMiddleware(), 'third' => new ThirdMiddleware() ]; $middlewareCollection = new MiddlewareCollection($middlewares, 'Request'); $middlewareCollection->run();
Это правильно, или нет? Я также не могу понять, как я должен был вызвать следующее промежуточное ПО в методе next () в моем классе MiddlewareCollection.
Это сообщение в блоге действительно полезно для объяснения того, как работает промежуточное программное обеспечение, и как вы можете создавать его с нуля.
Однако я буду использовать пример, который поставляется с Laravel, промежуточным программным обеспечением auth ( app/Http/Middleware/Authenticate.php
). Это промежуточное программное обеспечение защищает маршруты и гарантирует, что пользователь, который пытается получить к ним доступ, вошел в систему.
public function handle($request, Closure $next) { if ($this->auth->guest()) { if ($request->ajax()) { return response('Unauthorized.', 401); } else { return redirect()->guest('auth/login'); } } return $next($request); }
Функция handle
– это то, что делает для нас вся работа, в этом случае она начинается с принятия $request
который мы хотим отправиться, или запроса, который мы отправляем на сервер.
Затем мы проверяем, зарегистрирован ли пользователь или является гостем с if ($this->auth->guest())
Если мы вошли в систему, тогда это вернет false, и мы перейдем к return $next($request);
что позволило бы нам вести себя как обычно. Если мы не вошли в систему и не являемся гостем, мы передаем это утверждение как истинное и перейдем к утверждению if
.
Затем мы ударили:
if ($request->ajax()) { return response('Unauthorized.', 401); }
Это может быть самоочевидным, но он проверяет, является ли запрос вызовом ajax, и если он будет тогда, он вернет 401 несанкционированный ответ.
Если это не запрос ajax, мы нажмем на это:
else { return redirect()->guest('auth/login'); }
Что будет перенаправлять гостя на страницу входа. Как только они будут зарегистрированы в запросе, он может продолжить, и их запрос будет продолжен, как обычно.
Таким образом, я мог бы защитить маршрут www.mywebsite.com/admin
с этим промежуточным программным обеспечением, и если бы я не был зарегистрирован, я был бы перенаправлен на www.mywebsite.com/auth/login
и как только я войду в систему, я вернусь к моему первоначальному запросу www.mywebsite.com/admin
без каких-либо проблем.
Как я уже упоминал, хотя, проверьте это сообщение в блоге, потому что оно имеет некоторые полезные объяснения и более простые примеры.
Middleware, на Laravel до 5, были известны как фильтр. Middleware перехватывает запрос и затем обрабатывает внутри вашего класса промежуточного программного обеспечения, несет ответственность за следующее задание о том, что делать. Существует два типа промежуточного программного обеспечения, основанные на том, как вы справляетесь с этим.
Перед промежуточным программным обеспечением проверяется, прежде чем управление передается контроллеру. Логика находится внутри вашего метода обработки. Например, вы хотите, чтобы вы вошли в свой пост в своей гостевой книге. Итак, если вы используете до применения промежуточного программного обеспечения, и ваша логика подобна
и код будет таким,
public function handle($request, Closure $next) { // Perform action return $next($request); }
Послепродажное программное обеспечение проверяет, завершил ли контроллер выполнение всей задачи, и ответ будет передан пользователю. Для этого вы можете думать, что это был запрос API, и вы хотите обновить токен при каждом завершении запроса. для этого будет выглядеть код,
public function handle($request, Closure $next) { $response = $next($request); // Perform action return $response; }
Здесь для простоты вы можете думать о методе $ next, поскольку он будет передавать управление контроллеру. Для того, чтобы до промежуточного программного обеспечения он проверял логику, он возвращает управление контроллеру и, наконец, возвращает ответ.
С другой стороны, после промежуточного программного обеспечения передается управление контроллеру, когда контроллер завершает свое задание, тогда что-то сохраняется в переменной $ response и выполняет некоторую логику. После этого он возвращает ответ $.
Надеюсь, теперь это ясно.