如何使Laravel中的路由不区分大小写


How to make routes in Laravel case insensitive?

我在laravel有一个项目,在这个项目中有很多路线。

但是我刚刚发现所有的路由都是区分大小写的/advertiser/reports/advertiser/reports不同。

所以我想要的是两个路由都应该重定向到同一个视图。目前/advertiser/Reports给出RouteNotFound Exception.

我已经读过关于Route::pattern()的方法,但是由于有很多路由,我将不得不为此付出很多努力。所以,我想要的是一个更好的方法,如果有。

为了使路由不区分大小写,你需要修改路由与url的匹配方式。在Laravel中,这一切都发生在UriValidator object中,所以你需要创建自己的验证器。

幸运的是,像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;
});

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

请记住,此代码尚未通过运行测试。如果有任何错别字或某些东西不像预期的那样工作,请告诉我。我很乐意让它为你工作:)

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

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

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

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

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