簡體   English   中英

中間件如何在Laravel 5中運行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM