我正在和Laravel一起做论坛。 我决定有这样的路线:
Route::get('/{topicName}', 'ForumController@showTopic');
Route::get('/{postSubject}', 'ForumController@showPost');
我还有另一条路线,但是这两条路线位于底部,因为当我在URL中写入某些内容(并且laravel没有找到通过地址)时,所有内容都会落入此路线(尤其是第一条路线)。我不知道如何编程这两个最后的路线。 当有人添加我的主题名称时,他就会访问该网站:
http:/forum/php
或
http:/forum/javaScript
然后用户查看此主题的所有帖子。但是当用户想要查看一个特定的帖子时,我想要像这样的URL:
http:/forum/post_subject_name
现在用户可以看到具体的帖子。 怎么做,因为现在一切都落到我的第一个控制器 - ForumController @ showTopic')。这可能吗?
答案 0 :(得分:2)
你不能,这两条路线都有相同的要求,如果它们位于路线的底部,那么topicName将始终优先。
您应该有
等路线Route::get('/topics/{topicName}', 'ForumController@showTopic');
Route::get('/posts/{postSubject}', 'ForumController@showPost');
这样你可以区分它们
答案 1 :(得分:1)
问题是两条路线都包含一个参数而没有其他参数。如何知道给定参数是主题名称还是帖子主题?
但是,你可以做的是拥有一条路线并在控制器方法中完成剩下的工作:
Route::get('/{topicOrPost}', 'ForumController@showTopicOrPost');
public function showTopicOrPost($topicOrPost)
{
$topic = Topic::where('name', $topicOrPost)->first();
if ($topic !== null) {
// show the topic
} else {
$post = Post::where('subject', $topicOrPost)->first();
if ($post !== null) {
// show the post
} else {
// neither topic or post found
}
}
}
但是,当然,你必须确保没有主题和帖子具有相同的名称/主题。
答案 2 :(得分:0)
在我看来,你可以在路线中使用模式
Regular Expression Constraints
一些例子:
// This is what you might have right now
Route::get('users/{id}', 'UserController@getProfile')->where('id', '[\d+]+');
Route::get('products/{id}', 'ProductController@getProfile')->where('id', '[\d+]+');
Route::get('articles/{slug}', 'ArticleController@getFull')->where('slug', '[a-z0-9-]+');
Route::get('faq/{slug}', 'FaqController@getQuestion')->where('slug', '[a-z0-9-]+');
// and many more, now imagine you'll have to change the rule
// Instead, you could have a handy list of patterns and reuse them everywhere:
// Patterns
Route::pattern('id', '\d+');
Route::pattern('hash', '[a-z0-9]+');
Route::pattern('hex', '[a-f0-9]+');
Route::pattern('uuid', '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}');
Route::pattern('base', '[a-zA-Z0-9]+');
Route::pattern('slug', '[a-z0-9-]+');
Route
::pattern('username', '[a-z0-9_-]{3,16}');
对你而言,我认为你可以使用这样的东西:
Route::get('/{any}','SearchController@showPost')->where('any','^[post_]+$');
Route::get('/{any}','SearchController@showTopic');
但你必须在showpost之后使用ShowTopic路线