首页 > 解决方案 > 带有单个参数的 laravel 策略方法如何工作?

问题描述

我完全了解策略在获取主体和对象时的工作方式,例如$user->can('delete', $post),它将调用 PostPolicy::delete($user, $post) 来确定结果。

我不明白这些方法是如何喜欢viewAnycreate工作的,或者如何测试它们。我现在不能说$user->can('create'),可以吗?Laravel 的文档有时是一个迷宫(更不用说源代码了),当策略方法仅采用单个 $user 参数时,我还没有找到任何关于如何手动测试策略方法的信息。

编辑:正如答案中有用地指出的那样,只需传递类名。但它确实有一个问题:它必须是原始类名,而不是使用创建的别名class_alias(),这是修补程序的常用技巧。看这里:

>>> class_alias(\App\User::class, 'U')
=> true

>>> $u->can('viewAny', \App\User::class)
=> true

>>> $u->can('viewAny', U::class)
=> false

标签: laravel

解决方案


您可以将类名作为第二个参数传递,这将确定使用哪个策略进行授权。例如,如果要确保PostPolicy使用 ,可以执行以下操作。

$user->can('create', App\Post::class);

来自 Laravel 文档:

如前所述,某些操作(如创建)可能不需要模型实例。在这些情况下,您应该将类​​名传递给授权方法。类名将用于确定授权操作时使用的策略。


推荐阅读