不區分大小寫的路由
Laravel 的路線區分大小寫。這意味著一條路線就好
Route::get('login', ...);
將匹配一個 GET 請求到/login
,但不會匹配到/Login
的 GET 請求。
為了使你的路由不區分大小寫,你需要建立一個新的驗證程式類,該類將根據已定義的路由匹配請求的 URL。新驗證器與現有驗證器之間的唯一區別是,它將在編譯路由的正規表示式末尾附加 i 修飾符,以切換啟用不區分大小寫的匹配。
<?php namespace Some\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));
}
}
為了讓 Laravel 使用你的新驗證器,你需要更新用於匹配 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;
});
這將刪除原始驗證器並將你的驗證器新增到驗證器列表中。