中间件如何在Laravel 5中运行?

The*_*kus 4 php middleware laravel

我试图理解中间件在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();
Run Code Online (Sandbox Code Playgroud)

这是正确的方式吗?我也无法理解如何在MiddlewareCollection类的next()方法中调用下一个中间件.

Jam*_*mes 6

这篇博客文章非常适用于解释中间件的工作原理,以及如何从头开始构建一些.

但是,我将使用与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);
    }
Run Code Online (Sandbox Code Playgroud)

handle功能是我们所有的工作,在这种情况下,它通过接受$request我们想要去的地方或我们发送到服务器的请求开始.

接下来我们检查用户是否已登录或是否是来宾if ($this->auth->guest()) 如果我们已登录,那么这将返回false,我们将继续前进,return $next($request);这将允许我们正常进行.如果我们没有登录并且是访客,我们将此语句作为true传递并继续使用该if语句.

然后我们会点击:

if ($request->ajax()) {
                return response('Unauthorized.', 401);
            }
Run Code Online (Sandbox Code Playgroud)

这可能是不言自明的,但它检查请求是否是ajax调用,如果是,那么它将返回401未经授权的响应.

如果它不是ajax请求,那么我们点击这个:

else {
                return redirect()->guest('auth/login');
            }
Run Code Online (Sandbox Code Playgroud)

这会将访客重定向到登录页面.一旦他们登录,请求可以继续,他们的请求将照常进行.

因此,我可以www.mywebsite.com/admin使用这个中间件保护路由,如果我没有登录,那么我将被重定向到www.mywebsite.com/auth/login,一旦我登录,我将www.mywebsite.com/admin毫无困难地返回到我的原始请求.

正如我先提到的,请查看该博客文章,因为它确实有一些有用的解释和更简单的例子.