Nis*_*ava 10 php regex laravel laravel-routing laravel-5
我有一个laravel项目,该项目有很多路线.
但我刚刚发现路线都是区分大小写的,手段 /广告客户/报告与/ advertiser/Reports不同.
所以我想要的是路由应该重定向到相同的视图.目前 / advertiser/Reports提供RouteNotFound异常.
我已经阅读了关于Route :: pattern()的方法,但是由于有很多路线,我将不得不付出很多努力.所以,我想要的是更好的方法,如果有的话.
jed*_*ylo 12
为了使路由不区分大小写,您需要修改路由与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));
}
}
Run Code Online (Sandbox Code Playgroud)
其次,您需要更新用于将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;
});
Run Code Online (Sandbox Code Playgroud)
这将删除原始验证器并将您的验证器添加到验证器列表中.
请记住,此代码尚未通过运行进行测试.如果有任何拼写错误或某些内容无法按预期工作,请告诉我.我会非常乐意为你工作:)