[英]How does middleware work in Laravel 5?
我試圖理解中間件在Laravel 5中是如何工作的。我查看了Middleware Interface並理解我必須實現一個類,它有一個名為“handle”的方法。 在“handle”方法中,調用閉包。 但我不明白,關閉應該通過什么。 什么類會調用我的中間件? 它是如何在引擎蓋下工作的? 可能就像“foreach”一樣,所有的中間件都會被輪流調用? 更新:我正在嘗試實現自己的中間件:
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();
這是正確的方式嗎? 我也無法理解如何在MiddlewareCollection類的next()方法中調用下一個中間件。
這篇博客文章非常適用於解釋中間件的工作原理,以及如何從頭開始構建一些。
但是,我將使用與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);
這將使我們能夠正常進行。 如果我們沒有登錄並且是訪客,我們將此語句作為true傳遞,並繼續使用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
沒有任何問題。
正如我先提到的,請查看該博客文章,因為它確實有一些有用的解釋和更簡單的例子。
Laravel在5之前的中間件被稱為過濾器。 中間件攔截請求,然后在中間件類中處理,負責下一步的工作。 根據您的處理方式,有兩種類型的中間件。
在控制傳遞給控制器之前檢查之前的中間件。 邏輯在你的handle方法中。 比如,您希望登錄您的留言簿。 因此,如果您在應用中間件之前使用,那么您的邏輯就像
public function handle($request, Closure $next)
{
$response = $next($request);
// Perform action
return $response;
}
在控制器完成所有工作后,中間件檢查后,響應將傳遞給用戶。 為此,您可以將其視為已發出API請求,並且您希望在每個請求完成時刷新令牌。 對於這個代碼將是,像,
public function handle($request, Closure $next) { $response = $next($request); // Perform action return $response; }
在這里,為簡單起見,您可以考慮$ next方法,因為它將控制傳遞給控制器。 對於中間件之前,它檢查邏輯然后它將控制返回到控制器並最終返回響應。
另一方面,后中間件將控制傳遞給控制器,當控制器完成其工作時,然后將某些內容存儲在$ response變量上並執行一些邏輯。 之后,它返回$ response。
希望現在很清楚。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.