同路由不同控制器

Same route different controllers

我正在尝试使用相同的路线但使用不同的控制器,但没有得到一个干净而好的解决方案,例如我的意图是:

Domain.com/category-slug

Domain.com/article-slug

但是每个都有不同的controller,使用相同的结构routes并没有到达预期的controller,上面留下我的web.php

Route::get('/', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::get('/{category}', [App\Http\Controllers\QuestionController::class, 'index'])->name('category.list');

Route::get('/{slug}', [App\Http\Controllers\QuestionController::class, 'show'])->name('questions.show');

有没有人遇到同样的情况,是怎么处理的?

我建议对两种 slug 类型使用一个控制器操作,以确定需要做什么,并将请求转发到相应的控制器操作。

https://symfony.com/doc/current/controller/forwarding.html

正如Laravel所说,在这种情况下,第二条路线永远不会被访问,因为第一条路线会覆盖它所以,我只建议你检查一下即将到来的category如果它存在不匹配数据库中的任何类别然后将请求重定向到下一个路由,因为它很可能匹配 Article 模型中的任何记录,或者如果没有返回数据则最终中止请求。

public function index($category)
{
   $data = \App\Models\Category::where('name', $category)->get();

    if (empty($data)) {
        return redirect()->route('questions.show', $category);
    }

    return view('index', compact('data'));
}
public function show($article)
{
   $data = \App\Models\Article::where('name', $article)->get();

    if (empty($data)) {
        abort(404, "NOT FOUND");
    }

    return view('show', compact('data'));
}

无法通知系统给定的路由id是category还是slug,第一条路由不会让系统命中第二条路由。

Route::get('/', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::get('/{category}', [App\Http\Controllers\QuestionController::class, 'index'])->name('category.list');

Route::get('/{slug}', [App\Http\Controllers\QuestionController::class, 'show'])->name('questions.show');

所以修改它添加一个id类型的前缀like

Route::get('/', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::get('category/{category}', [App\Http\Controllers\QuestionController::class, 'index'])->name('category.list');

Route::get('slug/{slug}', [App\Http\Controllers\QuestionController::class, 'show'])->name('questions.show');

看起来会像

Domain.com/category/1
Domain.com/slug/1