如果我有两个路由组(用于简单的路由前缀)是否可以仅针对该组进行 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', ....)
})
第一个绑定(bind)到“items”的绑定(bind)被最后一个声明的绑定(bind)覆盖。我会将“items”重命名为其他名称,但嵌套资源路由是由 laravel 自动生成的。
即第一条路线是
/items/{items}
第二个是
/users/{users}/items/{items}
我只是重命名最终路由,但对于拥有一种资源权限的管理员和拥有另一种资源权限的用户所使用的资源而言,它们是有意义的。
最佳答案
有几件事。首先你不需要这个代码
Route::bind('items', function( $value, $route ){
$item = Item::find( $value );
if( !$item ) App::abort( 404 );
return $item;
})
你只需要
Route::bind('items', 'Item')
如果运行时无法绑定(bind) Item 模型,它会自动抛出 404 错误。
其次,您将无法做您想做的事情(有两个同名的不同绑定(bind)) - 但有两个选择。
选项 1 只是在路由文件中显式定义所有路由,并且不使用 Route::resource()
。本文来自Phil Sturgeon很好地解释了为什么您应该手动定义每条路线。
第二个选项只是使用主项目路由绑定(bind),但向用户项目添加过滤器。像这样的事情:
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);
}
});
关于laravel - Route::bind 在不同的组中具有相同的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24566821/