【问题标题】:Ignore route in Laravel 5.1在 Laravel 5.1 中忽略路线
【发布时间】:2015-09-18 08:45:40
【问题描述】:

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

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

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

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 完成吗?

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

【问题讨论】:

  • 我会在你的 ProfileController 路由中添加一个前缀,如 /users
  • @peaceman 我知道这会让事情变得更容易,但我真的想保留 /{username} 路线。
  • 你不能生成一个包含所有管理员定义的路由的 php 文件并将其包含在 ProfileController 路由之前吗?这也应该会导致更快的路由过程。

标签: php routes laravel-5


【解决方案1】:

如果$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 文件过于复杂,我将添加一个专门的服务类来分析您的 URL 段:

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 来处理所有传入的请求并分别调用控制器动作。

【讨论】:

  • 我认为从这样的另一个控制器调用控制器不是最好的主意。它不是很灵活,我希望能够随时调整我的路线。如果控制器操作返回 null 或其他内容,我认为如果路由尚未“匹配”,那将是完美的。
  • 我已经编辑了我的答案。希望这对您来说是一个很好的解决方案。
  • 这个解决方案也有问题。使用它,我在另一条路线时无法获取路线数据。我在示例中跳过了这一点,但我通过名称来调用我的路线,因为这是最灵活的方式。使用那个“if”语句,当我在其他地方时,我的命名路由不会被定义。
  • 您确实需要一个自定义路由处理程序作业,您可以像在我的第一个解决方案中那样手动调用您的控制器。我认为如果你的路由处理程序设计得很好,你仍然会非常灵活。另一种解决方案是重命名您的个人资料路线,使其匹配example.com/@username,也许这是您的选择。最后我想不出另一种解决方案。
猜你喜欢
  • 2016-05-03
  • 2016-01-24
  • 1970-01-01
  • 2015-10-08
  • 2016-10-20
  • 2020-09-27
  • 2015-12-24
  • 2018-06-26
  • 1970-01-01
相关资源
最近更新 更多