【问题标题】:How to condition route model bindings by actions in RouteServiceProvider如何通过 RouteServiceProvider 中的操作来调节路由模型绑定
【发布时间】:2015-09-25 03:23:39
【问题描述】:

我有一个应用程序需要在 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 操作可以更改已发布和未发布的文章。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    所以,你可以使用一个模式来绑定文章:

    公共功能启动(Router $router) { 父::boot($router);

    // 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。

    【讨论】:

    • 感谢您的回答。您的解决方案与您想要的不同。我想根据操作决定获取 Article 对象。例如,show(Article $articles)edit(Article $articles) 将具有不同的结果集,即使参数 {articles} 具有相同的值。
    • @why,让我知道您用于不同操作的两个网址
    • 我的路线使用资源方法Route::resource('articles', 'ArticlesController').
    • 你为什么要使用资源?你在使用 API 吗?
    • 因为我有一个需要 RESTful 控制器的文章商店。还有index,store,create等更多动作。但我尽量简化我的问题。
    【解决方案2】:

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

    【讨论】:

    • 用于过滤请求的中间件。但就我而言,我想根据给定的操作过滤模型绑定。此外,在我的控制器中,动作已经绑定到模型edit(Article $articles){}
    • 你的绑定其实是一个请求参数。仅在您的情况下,参数不是整数 ID,而是已解析的模型。此外,您可以在路由对象中找到此绑定。所以在我看来,在中间件中过滤你的模型是一个最佳决定。
    猜你喜欢
    • 2018-12-12
    • 2015-12-17
    • 1970-01-01
    • 2016-05-11
    • 2018-02-28
    • 1970-01-01
    • 2020-10-03
    • 2018-12-17
    • 2018-02-12
    相关资源
    最近更新 更多