【发布时间】:2019-10-26 07:25:32
【问题描述】:
在 laravel 5.8 中,我有 2 种类型的 url。
/news/{category} -> 发送到新闻控制器索引动作,如果有类别绑定 /news/{news} -> 发送到新闻控制器详细信息操作,如果有新闻绑定 另一个案例以 404 中止。
我该如何解决这个问题?
【问题讨论】:
标签: laravel controller routing action
在 laravel 5.8 中,我有 2 种类型的 url。
/news/{category} -> 发送到新闻控制器索引动作,如果有类别绑定 /news/{news} -> 发送到新闻控制器详细信息操作,如果有新闻绑定 另一个案例以 404 中止。
我该如何解决这个问题?
【问题讨论】:
标签: laravel controller routing action
在 Laravel 以及我所知道的几乎所有框架和路由系统中,Route 和 Controller/Action 的关系是 1:1。每条路由只能有一个控制器或动作来处理它。
如果我正确理解您的问题,您有一个单一的路由模式/news/{parameter},并且您希望发生以下三件事之一:
{parameter} 包含有效的类别段。检索类别并显示适当的视图。
{parameter} 包含有效的文章(详细信息)段。检索文章并显示适当的视图。
{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)并且可能使用户体验混乱。 (这也可能会损害搜索引擎的优化或结果,但这只是猜测——我没有任何证据可以证实或否认这一点。)
【讨论】: