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->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>
如果您想显示用户是所有者、访客或客人,您需要编写多少次代码?我认为在所有 controller 或 view 中都比在控制器中编写代码在 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:为啥要使用中间件来管理这个?