Маршрут :: привязка с одинаковым именем в разных группах?

#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 методов на каждом маршруте / контроллере. Я не думал об использовании фильтров таким образом, ценю сообщение