如何使Laravel的路线不敏感?

时间:2015-08-12 12:16:25

标签: php regex laravel laravel-5 laravel-routing

我有一个laravel项目,该项目有很多路线。

但我刚刚发现这些路线都是区分大小写的 / advertiser / reports / advertiser / Reports 不同。

所以我想要的是路由应该重定向到同一个视图。目前 / advertiser / Reports 提供RouteNotFound例外。

我已经阅读了 Route :: pattern()这样做的方法,但由于有很多路线我不得不为此付出很多努力。所以,我想要的是一种更好的方法,如果有的话。

3 个答案:

答案 0 :(得分:10)

为了使路由不区分大小写,您需要修改路由与URL匹配的方式。在Laravel中,这一切都发生在 UriValidator 对象中,因此您需要创建自己的验证器。

幸运的是,像 Laravel 中的大多数任务一样,它并不是很复杂。

首先,创建新的验证器类 - 这个与原始类的唯一区别在于,您将在正则表达式的末尾附加 i 修饰符,以便编译路由切换启用不区分大小写的匹配。

<?php namespace Your\Namespace;

use Illuminate\Http\Request;
use Illuminate\Routing\Route;
use Illuminate\Routing\Matching\ValidatorInterface;

class CaseInsensitiveUriValidator implements ValidatorInterface
{
  public function matches(Route $route, Request $request)
  {
    $path = $request->path() == '/' ? '/' : '/'.$request->path();
    return preg_match(preg_replace('/$/','i', $route->getCompiled()->getRegex()), rawurldecode($path));
  }
}

其次,您需要更新用于将URL与路径匹配的匹配器列表,并将原来的 UriValidator 替换为您的。

为此,请在 routes.php 文件的顶部添加以下内容:

<?php
use Illuminate\Routing\Route as IlluminateRoute;
use Your\Namespace\CaseInsensitiveUriValidator;
use Illuminate\Routing\Matching\UriValidator;

$validators = IlluminateRoute::getValidators();
$validators[] = new CaseInsensitiveUriValidator;
IlluminateRoute::$validators = array_filter($validators, function($validator) { 
  return get_class($validator) != UriValidator::class;
});

这将删除原始验证器并将您的验证器添加到验证器列表中。

请注意,此代码尚未通过运行进行测试。如果有任何拼写错误或某些内容没有按预期工作,请告诉我。我很乐意为你工作:)

答案 1 :(得分:1)

我知道这是一个老问题,但是我遇到了同样的问题,我只想分享我的解决方案。

在Exceptions / Handler.php的方法render(...)上,捕获404异常并验证URL的大小写,然后像这样重定向:

public function render($request, Exception $exception)
{
    if (
        $exception instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException &&
        $request->url() !== strtolower($request->url())
    ) {
        return redirect(strtolower($request->url()));
    }

    return parent::render($request, $exception);
}

就是这样。

答案 2 :(得分:0)

我写了一个要点:https://gist.github.com/samthomson/f670f9735d200773e543

编辑你的app / filters.php以检查路线中的大写字符并将它们重定向到转换后的路线。