如果我有两个路由组(用于路由的简单前缀),是否可以仅对那个组进行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”重命名为其他名称,但是laravel自动生成嵌套的Resource路由。
即第一条路线是
/ 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')
如果在运行时无法绑定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);
}
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句