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()方法中调用下一个中间件.
这篇博客文章非常适用于解释中间件的工作原理,以及如何从头开始构建一些.
但是,我将使用与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毫无困难地返回到我的原始请求.
正如我先提到的,请查看该博客文章,因为它确实有一些有用的解释和更简单的例子.
| 归档时间: |
|
| 查看次数: |
3155 次 |
| 最近记录: |