是否可以将 Laravel 策略应用于路由和自定义函数?
Posted
技术标签:
【中文标题】是否可以将 Laravel 策略应用于路由和自定义函数?【英文标题】:Is It Possible to Apply Laravel Policy to Both Routes and Custom Function? 【发布时间】:2019-03-06 12:19:24 【问题描述】:我有位置策略和一个 api 和一个自定义助手,我想使用相同的策略,
这里是例子:
1。读取位置记录的路由/API:
Route::group(['middleware' => 'policy:view,location'], function ()
// Read location
Route::post('/locations/location_id', [
'uses' => 'LocationApiController@read'
]);
);
2。自定义函数/助手读取位置记录
LocationHelper.php
/**
* Class LocationHelper.
*/
class LocationHelper
/** @var LocationRepositoryInterface */
private $locationRepo;
/**
* ReminderHelper constructor.
*/
public function __construct()
$this->locationRepo = App::make(LocationRepositoryInterface::class);
/**
* @param int $locationId
*/
public function readLocation($locationId)
$this->locationRepo->read($locationId);
问题是:
调用位置读取路由/api 策略时将适用,而从LocationHelper.php
调用读取函数时将不适用
我想要的是对两者应用相同的政策。
有没有办法做到这一点?
【问题讨论】:
【参考方案1】:您可以在检索用户后手动调用该策略。例如:
$allowed = Auth::user()->can('view', Location::firstOrFail($locationId));
如果不允许用户查看资源,则返回 403,如下所示:
abort_unless($allowed, 403);
【讨论】:
感谢您的宝贵时间,但是还有其他统一的解决方案吗? 您可以创建自己的一些抽象并尝试在 LocationRepository 中添加此检查,例如让它实现一个自定义的 PolicyInterface,但我真的不认为它会让事情变得更容易。 Laravel 不提供开箱即用的自定义帮助方法的授权检查。以上是关于是否可以将 Laravel 策略应用于路由和自定义函数?的主要内容,如果未能解决你的问题,请参考以下文章
在 Laravel 中:如何根据 URI 将多个过滤器应用于一整套路由?
将引导程序和自定义 css 应用于 django 中的 form 元素