如果我有两个路由组(对于路由的简单前缀),是否可以对该组进行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'的第一次绑定被声明的最后一个绑定。我会将'items'重命名为其他东西,但嵌套的Resource路由由laravel自动生成。
即第一条路线是
/项目/ {物品}
其中第二个是
/用户/ {用户} /项目/ {物品}
我只是简单地重命名结束路由,但是对于从具有一个资源权限的管理员和另一个资源上的用户使用的资源而言,它们是有意义的。
答案 0 :(得分:4)
有几件事。首先,你不需要这个代码
Route::bind('items', function( $value, $route ){
$item = Item::find( $value );
if( !$item ) App::abort( 404 );
return $item;
})
你只需要
Route::bind('items', 'Item')
如果它无法在运行时绑定Item模型,它将自动抛出404。
其次,你不能做你想要的(有两个不同的同名绑定) - 但有两种选择。
选项1只是明确地在您的路线文件中定义了所有路线,并且不要使用Route::resource()
。来自Phil Sturgeon的这篇文章很好地解释了为什么你应该手动定义每条路线。
第二个选项只是使用主项路由绑定,但是为用户项添加过滤器。像这样:
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);
}
});