Laravel 5.8-一条路线两个不同的控制器动作

Laravel 5.8-一条路线两个不同的控制器动作,laravel,controller,routing,action,Laravel,Controller,Routing,Action,在Laravel5.8中,我有两种类型的url /新闻/{category}->发送到新闻控制器索引操作(如果有类别绑定) /新闻/{news}->发送到新闻控制器详细信息操作(如果有新闻绑定) 另一例以404终止 如何解决这个问题?在Laravel和我所知道的几乎所有框架和路由系统中,路由和控制器/操作的关系是1:1。每个路由只能有一个控制器或操作来处理它 如果我正确理解了您的问题,您有一个单一的路由模式/news/{parameter},您希望发生以下三种情况之一: {parameter}包

在Laravel5.8中,我有两种类型的url

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


如何解决这个问题?

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

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

  • {parameter}
    包含有效的类别slug。检索类别并显示相应的视图

  • {parameter}
    包含有效的文章(详细信息)段塞。检索文章并显示相应的视图

  • {parameter}
    不包含有效的类别或项目段塞,因此找不到。返回404错误

  • 您仍然只需要一个控制器操作,但您可以分离逻辑以便于理解:

    routes/web.php:

    Route::get('/news/{param}','NewsController@index');
    
    app/Http/Controllers/NewsController(带伪代码):

    类NewsController扩展控制器
    {
    公共函数索引(字符串$param)
    {
    如果($category=category::whereSlug($param)->first()){
    //返回您的类别视图。
    }
    如果($article=article::whereSlug($param)->first()){
    //返回您的文章视图。
    }
    \中止(404);
    }
    }
    
    我个人建议不要为这两种不同的实体类型共享一个通用的URL结构。它可能导致名称冲突(类别和文章具有相同的slug),并且可能会让用户体验混乱。(这也可能会损害搜索引擎的优化或结果,但这只是猜测——我没有什么要证实或否认的。)