Laravel 5.8-一路两种不同的控制器动作

时间:2019-06-11 20:08:11

标签: laravel controller routing action

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

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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

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

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

  2. {parameter}包含有效的Article(细节)条。检索文章并显示适当的视图。

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

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

routes / 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结构。它打开了名称冲突的可能性(“类别”和“文章”具有相同的标记),并且可能使用户体验混乱。 (这也可能会损害搜索引擎的优化或结果,但这只是猜测-我没有任何要确认或否认的东西。)