我在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,检查路由中的大写字符,并将它们重定向到转换后的路由。