Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel:路由中间件和策略之间的区别_Php_Laravel_Middleware - Fatal编程技术网

Php Laravel:路由中间件和策略之间的区别

Php Laravel:路由中间件和策略之间的区别,php,laravel,middleware,Php,Laravel,Middleware,使用laravel开发应用程序时,我意识到使用策略可以做的事情完全可以通过中间件来完成。假设我想阻止用户更新路由,如果他/她不是信息的所有者,我可以很容易地从路由中进行检查,也可以从策略中进行检查 因此,我的问题是为什么我应该在中间件上使用策略,反之亦然路由中间件允许您将请求处理应用于大量路由,而不是在每个控制器操作中重复代码-检查身份验证和重定向来宾就是一个很好的例子。相反,控制器包含特定路由/操作所特有的逻辑-您可以使用中间件来实现这一点,但您需要为每个路由的逻辑使用单独的中间件,这一切都会

使用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