Php Laravel:路由中间件和策略之间的区别
使用laravel开发应用程序时,我意识到使用Php Laravel:路由中间件和策略之间的区别,php,laravel,middleware,Php,Laravel,Middleware,使用laravel开发应用程序时,我意识到使用策略可以做的事情完全可以通过中间件来完成。假设我想阻止用户更新路由,如果他/她不是信息的所有者,我可以很容易地从路由中进行检查,也可以从策略中进行检查 因此,我的问题是为什么我应该在中间件上使用策略,反之亦然路由中间件允许您将请求处理应用于大量路由,而不是在每个控制器操作中重复代码-检查身份验证和重定向来宾就是一个很好的例子。相反,控制器包含特定路由/操作所特有的逻辑-您可以使用中间件来实现这一点,但您需要为每个路由的逻辑使用单独的中间件,这一切都会
策略
可以做的事情完全可以通过中间件
来完成。假设我想阻止用户更新路由,如果他/她不是信息的所有者,我可以很容易地从路由中进行检查,也可以从策略中进行检查
因此,我的问题是为什么我应该在中间件上使用
策略
,反之亦然路由中间件允许您将请求处理应用于大量路由,而不是在每个控制器操作中重复代码-检查身份验证和重定向来宾就是一个很好的例子。相反,控制器包含特定路由/操作所特有的逻辑-您可以使用中间件来实现这一点,但您需要为每个路由的逻辑使用单独的中间件,这一切都会变得非常混乱
策略/能力只是检查用户权限的一种方式——您可以从控制器、中间件或其他任何地方查询它们。它们只返回true或false,因此它们与控制器或中间件不同。大多数时候,功能都会将用户与另一个模型进行比较,该模型是根据发送给控制器操作的标识符加载的,但也可能有一些应用程序与中间件一起使用。我目前正在对我的角色、权限和路由进行一次小的重构,并问自己同样的问题 从表面上看,真正的中间件和策略执行相同的总体思想。检查用户是否可以执行他们正在执行的操作 以下是拉威尔文件供参考 中间件 “我可以看看这个吗?我可以去这里吗?” HTTP中间件为过滤HTTP提供了一种方便的机制 输入应用程序的请求。例如,Laravel包括一个 用于验证应用程序用户是否可用的中间件 认证的。如果用户未经过身份验证,中间件将 将用户重定向到登录屏幕。但是,如果用户是 通过身份验证,中间件将允许请求继续 进一步进入应用程序 当然,可以编写额外的中间件来执行各种操作 除了身份验证之外,还有许多任务。CORS中间件可能是 负责为所有回复添加适当的标题 你的申请。日志中间件可能会记录所有传入的请求 到您的应用程序 在我看来,中间件是关于在请求级别操作的。在“这个用户能看到一个页面吗?”,或者“这个用户能在这里做些什么吗?” 如果是,则转到与该页关联的控制器方法。有趣的是,中间件可能会说,“是的,你可以去那里,但我会写下你要去的地方。”等等 一旦完成了。它对用户正在做的事情没有更多的控制权或发言权。另一方面,我认为它是中间人 政策 “我能做这个吗?我能改变这个吗?” 除了提供开箱即用的身份验证服务, Laravel还提供了一种简单的方法来组织授权逻辑和 控制对资源的访问。有多种方法和方法 帮助您组织授权逻辑的助手,以及 我们将在本文档中介绍它们 然而,政策似乎更关心做什么。用户可以更新任何条目,还是只更新他们的条目 这些问题似乎适合于一个控制器方法,其中对资源的所有操作调用都是有组织的。检索此对象、存储或更新文章 同样,中间件会使路由变得非常混乱和难以管理。这是“我的路线”文件中的一个示例: 问题
Route::group(['middleware' =>'role:person_type,person_type2',], function () {
Route::get('download-thing/{thing}', [
'as' => 'download-thing',
'uses' => 'ThingController@download'
]);
});
这在我的路由文件中变得很难读取
另一种策略方法
//ThingController
public function download(Thing $thing)
{
//Policy method and controller method match, no need to name it
$this->authorize($thing);
//download logic here....
}
我也问过自己同样的问题。实际上,我主要使用中间件。 我最常见的用法是仅允许特定用户进行授权,例如:
public function update(User $user, user $model)
{
return $user->id === $model->id;
}
虽然,即使在上面的例子中,是的,人们也可以不用它,在控制器中编写自己的逻辑来做同样的事情
我还喜欢before方法,我使用该方法允许管理员对模型拥有完全权限,例如:
public function before($user, $ability)
{
if ($user->admin === 1) {
return true;
}
}
不过,我开始在一些Laravel项目上使用策略的主要原因是您可以使用blade。如果您发现自己在刀片文件中多次为同一用户授权设置权限,例如显示编辑按钮,那么策略可能会非常有用,因为您可以使用它们执行以下操作(以及更多操作):
@can('update',$post)
编辑文章
@恩德坎
@无法('create',App\Models\Post::class)
不允许您创建帖子
@Endcant
有时,我发现这些策略引用刀片方法非常有用,因为我想在一个地方对授权进行分组。我认为您应该尝试这样看:中间件用于身份验证,而策略用于授权。as=>“download thing”做什么?我觉得它做了类似于“在处理此请求的其余部分时充当此模型”的事情。我正试图找到关于它的文档,但到目前为止运气不好。编辑:我找到了。它允许您“命名”路由,以便于在生成URL或重定向用户时使用。对我来说用处不大:(回答得很好!该策略的另一个好处是,您可以使用
can
命令在刀片模板中使用它。
@can('update', $post)
<button class="btn btn-primary">Edit Post</button>
@endcan
@cannot('create', App\Models\Post::class)
<div class="alert alert-warning">You are not allowed to create a post</div>
@endcannot