如何通过RouteServiceProvider中的操作来调整路径模型绑定

时间:2015-07-07 14:47:45

标签: laravel laravel-4 laravel-5 laravel-routing

我有一个应用程序需要在RouteServiceProvider.php中完成此任务:

//in \App\Providers\RouteServiceProvider.php
public function boot(Router $router)
{
    //

    parent::boot($router);

    //somehow can get the current action

    $action = $router->getCurrentAction();

    if($action == 'edit'){  
        $router->model('articles','App\Article');       
    } else{
        $router->bind('articles', function($id){
            return Article::published()->findOrFail($id);
        });
    }  
}

这是我的路线:

Route::resource('articles', 'ArticlesController');

这是我的控制器:

public function show(Article $article){

    return view('articles.show',compact('article'));
}

public function edit(Article $article){

    return view('articles.edit',compact(['article','tags']));

}

我想要这样做的原因是因为我希望show操作仅显示已发布的文章,而edit操作可以更改已发布和未发布的文章。

如果有更好的解决方案,请教我。谢谢!

2 个答案:

答案 0 :(得分:0)

为什么不制作一个仅适用于“已发布”路线的中间件,在那里您将检查您的文章是否已发布?

答案 1 :(得分:0)

根据您的路线,我假设您有以下路径:

  • example.com/edit
  • example.com/3 - 文章ID

因此,您可以使用模式绑定文章:

公共功能启动(路由器$路由器) {     父::引导($路由器);

// bind 
$router->bind('article', function($id){
    return Article::published()->findOrFail($id);
});

// id pattern
 $router->pattern('id', '[0-9]+');

}

现在,只需声明相应的路线:

Route::get('articles', 'ArticlesController@showAll');
Route::get('{id}', 'ArticlesController@edit');

最后,您的控制器可能如下所示:

class ArticlesController{

    public funcion showAll(){
        // show a list of articles
    }

    public function edit(Article $article){
        // selected article
    }
}

尝试使用类注入和保持清洁代码来充分利用Laravel。