命名路由匹配基于路由名精确比对,通配符admin.*为前缀匹配机制;Route::is()仅支持单名严格相等,不支持数组或通配符;routeIs()遍历数组逐项匹配,含*则前缀匹配,否则严格相等。
命名路由匹配的核心逻辑是基于当前请求路由的“命名标识”做精确比对,而非解析 URL 字符串。Laravel 不会把 /admin/users/5/edit 拆成路径段去逐级匹配,而是直接调用 Route::current()->named() 获取已注册的路由名(如 admin.users.edit),再与目标名称进行字符串比对——这是稳定、可靠且不受参数值影响的关键。
通配符(如 admin.*)不是正则表达式,而是 Laravel 内置的前缀匹配机制:它将目标名按点号 . 分割,检查当前路由名是否以指定前缀开头,并且后续部分存在(即不能完全相等,必须有子级)。例如:
request()->routeIs(['admin.*']) 匹配 admin.dashboard、admin.users.index,但不匹配 admin;request()->routeIs(['api.v1.*', 'home']) 同时支持多前缀和单一名字;Route::is() 是静态门面方法,设计初衷是单名精确匹配。它底层调用 Router::current()->getName() === $name,没有扩展逻辑处理数组或模式。若强行传入数组,PHP 会报类型错误;若传入 'admin.*' 字符串,则按字面匹配,不会触发通配行为——因为该方法本身无解析逻辑。
当你调用 request()->routeIs(['user.login', 'user.register']) 时,框架实际执行以下步骤:
$request->route());$route->getName() 得到当前命名路由字符串;*,执行前缀匹配(Str::startsWith($currentName, $pattern));true,不继续遍历。避免将通配符写成正则形式(如 'admin..*'),这会被当作普通字符串处理,必然失败;也不要混用命名与路径判断(如 request()->routeIs(['/admin'])),命名路由必须使用注册时指定的 name,而非 URI。
不复杂但容易忽略:命名路由匹配只依赖 name() 方法输出,确保你在定义路由时显式调用了 ->name('xxx'),否则 routeIs() 总是返回 false。