php 基于ID(laravel,透视表)动态保护路由

5m1hhzi4  于 2023-04-28  发布在  PHP
关注(0)|答案(1)|浏览(150)

这个主题在这里讨论了很多,但我不明白。
我想使用数据透视表(user_customer_relation,user_object_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正确传递给筛选器?

von4xj4u

von4xj4u1#

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

$id = Route::input('id');

优化

public function hasCustomer($id) {
    if($this->customers()->find($id)){
        return true;
    }

    return false;
}

甚至是

public function hasCustomer($id) {
    return !! $this->customers()->find($id)
}

(The double !!null/Customer结果转换为布尔值)

通用方法

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

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

相关问题