#laravel #laravel-4
#laravel #laravel-4
Вопрос:
Если у меня есть две группы маршрутов (для простого префикса маршрутов), возможно ли Route::bind только для этой группы?
Когда я делаю следующее:
Route::group( array('prefix'=>'pre1'), function(){
Route::bind('items', function( $value, $route ){
$item = Item::find( $value );
if( !$item ) App::abort( 404 );
return $item;
})
Route::resource('items', .... );
})
Route::group( array('prefix'=>'pre2'), function(){
//put bind for users here...
Route::bind('items', function( $value, $route ){
$user_id = $route->parameter('users')->getAttribute('id');
$item = Item::where('id', $value)->whereUserId( $user_id );
if( !$item ) App::abort( 404 );
return $item;
})
Route::resource('users.items', ....)
})
Первая привязка к «элементам» переопределяется последней объявленной. Я бы переименовал ‘items’ во что-то другое, но маршруты вложенных ресурсов автоматически генерируются laravel.
Т.е. первый маршрут — это
/элементы/{элементы}
где второй
/пользователи/{users}/элементы/{items}
Я бы просто переименовал конечные маршруты, но они имеют смысл в отношении ресурсов, используемых администратором, имеющим разрешения на один ресурс, и пользователями на другом.
Ответ №1:
Пара вещей. Во-первых, вам не нужен этот код
Route::bind('items', function( $value, $route ){
$item = Item::find( $value );
if( !$item ) App::abort( 404 );
return $item;
})
Вам просто нужно
Route::bind('items', 'Item')
Он автоматически выдаст 404, если не сможет привязать модель элемента во время выполнения.
Во-вторых, вы не сможете делать то, что хотите (иметь две разные привязки с одинаковым именем) — но есть два варианта.
Вариант 1 — просто явно определить все ваши маршруты в вашем файле routes и не использовать Route::resource()
. Эта статья от Фила Стерджена дает отличное объяснение того, почему вы должны просто определять каждый маршрут вручную.
Второй вариант — просто использовать привязку маршрута основных элементов, но добавить фильтр к пользовательским элементам. Что-то вроде этого:
Route::group( array('prefix'=>'pre2', 'before' => 'user.item'), function(){
Затем определите фильтр, который проверяет, принадлежит ли элемент пользователю
Route::filter('user.item', function($route, $request)
{
if ($route->parameter('item')->user_id !== Auth::user()->id)
{
App::abort(404);
}
});
Комментарии:
1. Я согласен с большей частью статьи по этой ссылке. Я чувствую, что наличие всех маршрутов приложений в одном файле является излишеством, и использование Resource, по крайней мере, уменьшило повторяющийся характер размещения стандартных 4 методов на каждом маршруте / контроллере. Я не думал об использовании фильтров таким образом, ценю сообщение