英文:
How to define a route which chooses to right Controller on the fly /{slug}
问题
我现在正面临一个挑战,我有两个控制器使用相同的路由模式。
为了简化,假设我们有一个 BlogController
和一个 PageController
。这两个控制器都有相同的路由 /{slug}
。
当然,在这个简单的示例中,我可以为 BlogController
的路由添加前缀 /blog/{slug}
,然后有两个简单的路由。但在我的情况下,这不是一个选项。两个控制器的路由肯定应该只是 /{slug}
,没有任何前缀或后缀。
目前,我有一个路由 / {slug}
,它触发一个 SlugController。在这个控制器中,我首先检查是否有一个带有此 slug 的博客记录。如果是的话,我调用 BlogController
。对于 PageController
也是同样的检查。否则返回 404。
有没有更智能的方法来在 routes/web.php
中进行此检查,以确定应该为给定的 slug 使用哪个控制器?
英文:
I am currently facing the challenge, that I have the same route pattern for two Controllers.
To make it easier, let's say we have a BlogController
and a PageController
. Both controllers have the same route /{slug}
.
Of course, in this simple example I could prefix the routes for the BlogController
with /blog/{slug}
and have two simple routes then. But this isn't an option in my case. Both Controller's routes should definitely be just /{slug}
without any pre- / postfixes.
At the moment, I have one route /{slug} which triggers a SlugController. In this Controller I first check, if there is a Blog-record with this slug. If yes, I invoke the BlogController
. Same check for PageController
. Otherwise 404.
Is there any smarter way, to do this check, which Controller should be used for a given slug earlier? In the routes/web.php
?
答案1
得分: 1
1 - 你可以在URL中指定类型:
website.com/page/slug
website.com/slug
2 - 你可以创建一个路由,但控制器需要有两个方法,根据表中的类型(blog或page)执行不同的方法。
3 - 第三种解决方案,我认为这是你要找的,也是你想听到的:
你可以指定相同的路由URL,并根据参数调用不同的控制器:
Route::get('/{slug}', [App\Http\Controllers\PageController::class, 'index'])->where('slug', '(about|contact|pages列表中的任何页面)');
Route::get('/{slug}', [App\Http\Controllers\BlogController::class, 'index']);
英文:
There are several solutions
1 - You can specify the type in the url
website.com/page/slug
website.com/slug
2 - You can make one route but controller 2 methods
Depending on the type in the table, if it is blog or page
3 - The third solution, and I think this is what you are looking for and want to hear
You can specify the same route url and call different controllers based on the parameter
Route::get('/{slug}', [App\Http\Controllers\PageController::class, 'index'])->where('slug', '(about|contact|any page from pages list)');
Route::get('/{slug}', [App\Http\Controllers\BlogController::class, 'index']);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论