Эта тема много обсуждалась здесь, но я не понимаю.
Я хотел бы защитить свои маршруты с помощью сводных таблиц (user_customer_relation, user_object_relation (…)), но я не понимаю, как правильно применить фильтр.
Route::get('customer/{id}', 'CustomerController@getCustomer')->before('customer')
Теперь я могу добавить некоторые значения в фильтр до
->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;
}
Как правильно передать идентификатор клиента в фильтр?
Вы не можете передать параметр маршрута в фильтр. Однако вы можете получить доступ к параметрам маршрута практически из любого места в приложении, используя 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)
}
(Двойной !!
бросит 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
Других решений пока нет …