【问题标题】:Laravel 5.8 - one route two different controller actionLaravel 5.8 - 一个路由两个不同的控制器动作
【发布时间】:2019-10-26 07:25:32
【问题描述】:

在 laravel 5.8 中,我有 2 种类型的 url。

/news/{category} -> 发送到新闻控制器索引动作,如果有类别绑定 /news/{news} -> 发送到新闻控制器详细信息操作,如果有新闻绑定 另一个案例以 404 中止。

我该如何解决这个问题?

【问题讨论】:

    标签: laravel controller routing action


    【解决方案1】:

    在 Laravel 以及我所知道的几乎所有框架和路由系统中,Route 和 Controller/Action 的关系是 1:1。每条路由只能有一个控制器或动作来处理它。

    如果我正确理解您的问题,您有一个单一的路由模式/news/{parameter},并且您希望发生以下三件事之一:

    1. {parameter} 包含有效的类别段。检索类别并显示适当的视图。

    2. {parameter} 包含有效的文章(详细信息)段。检索文章并显示适当的视图。

    3. {parameter} 不包含有效的类别或文章 slug,因此找不到。返回 404 错误。

    您仍然只需要一个控制器操作,但您可以将逻辑分开以使其易于理解:

    路由/web.php:

    Route::get('/news/{param}', 'NewsController@index');
    

    app/Http/Controllers/NewsController(带有伪代码):

    class NewsController extends Controller
    {
        public function index(string $param)
        {
            if ($category = Category::whereSlug($param)->first()) {
                // Return your category view.
            }
    
            if ($article = Article::whereSlug($param)->first()) {
                // Return your article view.
            }
    
            \abort(404);
        }
    }
    

    我个人建议不要像这样为两种不同的实体类型共享一个通用的 URL 结构。它打开了名称冲突的可能性(类别和文章具有相同的 slug)并且可能使用户体验混乱。 (这也可能会损害搜索引擎的优化或结果,但这只是猜测——我没有任何证据可以证实或否认这一点。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 2019-09-22
      • 1970-01-01
      • 2014-11-01
      • 2019-11-26
      相关资源
      最近更新 更多