Php 基于id(laravel、透视表)动态保护路由

Php 基于id(laravel、透视表)动态保护路由,php,laravel,routes,pivot,protection,Php,Laravel,Routes,Pivot,Protection,这个话题在这里讨论了很多,但我不明白 我想用透视表(user\u customer\u relation,user\u object\u relation(…)来保护我的路由,但我不明白如何正确应用过滤器 Route::get('customer/{id}', 'CustomerController@getCustomer')->before('customer') 现在我可以向before过滤器添加一些值 ->before('customer:2') 如何动态地执行此操作 在

这个话题在这里讨论了很多,但我不明白

我想用透视表(user\u customer\u relation,user\u object\u relation(…)来保护我的路由,但我不明白如何正确应用过滤器

Route::get('customer/{id}', 'CustomerController@getCustomer')->before('customer')
现在我可以向before过滤器添加一些值

->before('customer:2') 
如何动态地执行此操作

在过滤器中,我可以执行以下操作:

if(!User::hasAccessToCustomer($id)) {
    App::abort(403); 
}
在hasAccessToCustomer函数中:

public function hasCustomer($id) {
    if(in_array($id, $this->customers->lists('id'))) {
        return true;
    }

    return false;
}

如何将客户id正确传递给过滤器

不能将路由参数传递给筛选器。但是,您可以使用
route::input()
,从应用程序的几乎所有位置访问路由参数:

优化 甚至

public function hasCustomer($id) {
    return !! $this->customers()->find($id)
}
(双精度
!!
null
/
客户
结果转换为布尔值)

一般方法 这里有一种可能的、更通用的方法来解决这个问题:(虽然没有经过测试)

下面是您将如何使用它:

->before('id_in_related:customers')
->before('id_in_related:objects')
// and so on

谢谢我的方法合适吗?或者你能推荐一个更好的解决方案吗?我觉得很好。尽管您可以肯定地对hasCustomer进行一点优化。我会更新我的答案。非常感谢!也许这项任务很简单,但一开始我就很困惑。此外,我正在考虑一种更通用的方法来检查权限,因为如果我以后要保护>10页,我将创建几乎十倍于同一个筛选器?所有筛选器的工作方式都相同?(如果id在用户授权访问的相关模型中)是的,目前这是我的方法。也许我以后会扩展它。
public function hasCustomer($id) {
    return !! $this->customers()->find($id)
}
Route::filter('id_in_related', function($route, $request, $relationName){
    $user = Auth::user();
    if(!$user->{$relationName}()->find($route->parameter('id')){
        App::abort(403);
    }
});
->before('id_in_related:customers')
->before('id_in_related:objects')
// and so on