Laravel:我为啥要使用中间件?

Posted

技术标签:

【中文标题】Laravel:我为啥要使用中间件?【英文标题】:Laravel: Why should I use Middlewares?Laravel:我为什么要使用中间件? 【发布时间】:2017-05-18 18:36:01 【问题描述】:

例如,在我的用户类中,我有一个“isAdmin”函数,它检查用户表列中用户的角色值,所以在这种情况下我真的不认为需要使用中间件。 如果我想检查用户是否是我的应用程序中特定帖子的所有者,我会在我看来这样做:

@if(Auth::user()->id == $user->id) //$user is the passed user to the view
    <p>I am the owner of the post</p>
@elseif(Auth::guest())
    <p>I'm a visitor</p>
@else
    <p>I'm a registered user visiting this post</p>

我是对的还是我做错了什么?

【问题讨论】:

我不是 laravel 专家,我是 2 周前开始学习的,但我认为你不正确。中间件先做事,如果它没有失败,则继续正常执行,或者您可能会进行一些 IP 检查或代理。我认为你的观点不对,你应该检查$post(如果这个模型存在,它应该)owner/user_id like this $post-&gt;user_id 或类似的东西。 philsturgeon.uk/php/2016/05/31/why-care-about-php-middleware 【参考方案1】:

中间件的一大好处是您可以将一组逻辑应用于route group,而不必将该代码添加到每个控制器方法中。

Route::group(['prefix' => '/admin', 'middleware' => ['admin']], function () 
     // Routes go here that require admin access
);

在控制器中,您永远不必添加检查以查看他们是否是管理员。只有通过中间件检查才能访问路由。

【讨论】:

感谢您的回答。所以所有从 /admin 继承的路由(例如:/admin/dashboard 或 /admin/userslist/blahblah)都应该通过中间件以前? 是的,路由组会自动为你做。【参考方案2】:

中间件在调用控制器操作之前调用,因此它被用作过滤请求或添加外部数据,这些数据不会基于某些条件来自请求。

让我们举一个简单的例子。

@if(Auth::user()->id == $user->id) //$user is the passed user to the view
    <p>I am the owner of the post</p>
@elseif(Auth::guest())
    <p>I'm a visitor</p>
@else
    <p>I'm a registered user visiting this post</p>  

如果您想显示用户是所有者、访客或客人,您需要编写多少次代码?我认为在所有 controllerview 中都比在控制器中编写代码在 Middleware 中编写代码并将中间件应用于您想要的路由组要好显示。

在你的中间件中

public function handle($request, Closure $next)
 
    @if(Auth::user()->id == $user->id) 
    $user_type = "<p>I am the owner of the post</p>";
   @elseif(Auth::guest())
     $user_type = "<p>I'm a visitor</p>";
   @else
     $user_type = "<p>I'm a registered user visiting this post</p> ";

    $request -> attributes('user_type' => $user_type);

    return $next($request);
 

所以'现在在您的控制器中,您可以访问 $user_type 并传递给视图。

在你的视野中

 $user_type 

【讨论】:

以上是关于Laravel:我为啥要使用中间件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Laravel 中间件适用于单个路由而不适用于一组路由

Redux+Websockets:为啥要使用中间件来管理这个?

为啥我在 laravel 中运行测试时收到“CSRF 令牌不匹配”?

为啥要恢复中间视图控制器?

laravel中间键组

laravel 自定义过滤中间件