忽略Laravel 5.1中的路线

时间:2015-09-18 08:45:40

标签: php routes laravel-5

我想为我的Laravel应用创建动态页面CMS。管理员可以为任何页面提供任何URI,例如,他可以创建包含one/two/three URI的页面,http://example.com/one/two/three将指向此站点。我已经发现可以为多级网址添加单一路由,如下所示:

get('{uri}', 'PageController@view')->where('uri', '.+');

现在,我还想让/{username}个网址指向用户个人资料。这意味着,如果我需要让它一起工作。对我来说,完美的代码将是这样的:

get('{username}', 'ProfileController@view');
get('{uri}', 'PageController@view')->where('uri', '.+');

然后,在ProfileController中,我想让我的路线走得更远,就像它不在那里一样。像这样:

// ProfileController

public function view()
{
    $user = User::whereUsername($username)->first();

    if ($user === null) {
        // Go to the next route.
    }
}

可以用Laravel完成吗?

我可以想到另一个解决方案,只是为用户名和页面uris映射提供动态路由控制器,但我更愿意将它作为单独的路由。

1 个答案:

答案 0 :(得分:0)

如果$usernull,您可以从服务容器中解析新的PageController实例。

// ProfileController

public function view()
{
    $user = User::whereUsername($username)->first();

    if ($user === null) {
        // Go to the next route.
        $params = []; // If your view method on the PageController has any parameters, define them here
        $pageController = app(PageController::class);
        return $pageController->callAction('view', $params)
    }
}

这样,{username}路由将保留,但会显示管理员定义的自定义内容。

修改

如果您不想手动调用控制器,则可以在定义路径之前分析当前URL段并检查现有用户。为了不使您的routes.php文件过于复杂,我会添加一个专门的服务类来分析您的网址细分:

App\Services\RouteService.php:

<?php

namespace App\Services;

class RouteService {

    public static function isUserRoute()
    {
        if(count(Request::segments()) == 1)
            return !! User::whereUsername(Request::segment(1))->first();
        }

        return false;
    }

}

routes.php:

<?php

use App\Services\RouteService;

if(RouteService::isUserRoute())
{
    get('{username}', 'ProfileController@view');
}

get('{uri}', 'PageController@view')->where('uri', '.+');

我没有对此进行测试,但它应该可行。根据您的需要调整RouteService类。

我正在使用我的CMS中的第一种方法,它确实很有效。唯一的区别是我编写了一个处理所有传入请求的Job,并分别调用控制器操作。