【问题标题】:Route::bind with same name in different groups?Route::bind 在不同的组中具有相同的名称?
【发布时间】:2014-08-25 08:26:35
【问题描述】:

如果我有两个路由组(用于路由的简单前缀),是否可以仅对每个组进行 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 自动生成的。

即第一条路线是

/items/{items}

第二个在哪里

/users/{users}/items/{items}

我会简单地重命名最终路由,但它们对于管理员使用的资源是有意义的,该管理员对一个资源具有权限,而用户对另一个资源具有权限。

【问题讨论】:

    标签: laravel laravel-4


    【解决方案1】:

    有几件事。首先你不需要这个代码

      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 的这篇文章很好地解释了为什么你应该手动定义每条路由。

    第二个选项只是使用主 Items 路由绑定,但为用户项添加过滤器。像这样的:

    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);
        }
    });
    

    【讨论】:

    • 我同意该链接中的大部分文章。我觉得将整个应用程序路由放在一个文件中是多余的,并且使用 Resource 至少减轻了将标准 4 种方法放在每个路由/控制器上的重复性。我没有想过以这种方式使用过滤器,感谢帖子
    猜你喜欢
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2013-02-16
    • 2019-10-21
    相关资源
    最近更新 更多