laravel - 带有单个参数的 laravel 策略方法如何工作?
问题描述
我完全了解策略在获取主体和对象时的工作方式,例如$user->can('delete', $post)
,它将调用 PostPolicy::delete($user, $post) 来确定结果。
我不明白这些方法是如何喜欢viewAny
或create
工作的,或者如何测试它们。我现在不能说$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
解决方案
您可以将类名作为第二个参数传递,这将确定使用哪个策略进行授权。例如,如果要确保PostPolicy
使用 ,可以执行以下操作。
$user->can('create', App\Post::class);
来自 Laravel 文档:
如前所述,某些操作(如创建)可能不需要模型实例。在这些情况下,您应该将类名传递给授权方法。类名将用于确定授权操作时使用的策略。
推荐阅读
- javascript - 带有 HTTP 请求的单元测试返回 Promise {
} - angular - Angular 4 Reactive form reset() 函数在重置时显示错误消息
- awk - 在 awk 中组合和处理 2 个制表符分隔的文件并创建一个新文件
- python - 如何使用 python one-liner 从 bash 中的 json 文件中获取嵌套键的值?
- ios - swift - tableViewCell 内的项目的动态列表
- xamarin - 如何将视图检测为父视图
- kotlin - Protobuf 中的 Kotlin 数据类支持
- c# - 使用 System.IO.Directory.CreateDirectory() 时出现 FileNotFoundException
- c# - Windows 用户密码验证
- sql-server - SQL使用存储过程从excel中插入日期