Laravel路由 - 两个url地址与simillar名称

时间:2017-06-27 08:33:02

标签: php laravel routes

我正在和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')。这可能吗?

3 个答案:

答案 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路线