我遇到的情况: 请考虑以下情况:
Route::pattern()
或我们可以使用Route::({method}/{keyword})->where('keyword', {regex});
array( 'keyword' => "/^{regex}$/");
两者都接受不同格式的正则表达式
在案例1:Route::pattern()
或Route::()->where()
中,它不接受/ ^ {regex} $ / format中的正则表达式。它只接受Route::pattern('keword', {regex})
。
在案例2中:它接受/^{regex}$/
模式中的正则表达式。
所以简而言之,我不能在两个地方都应用同样的东西。这就是为什么我必须写两个不同的正则表达式,但它们是相同的。
我错过了什么吗?是否可以立即定义模型正则表达式和路由模式正则表达式?所以改变一个正则表达式,我们不必改变另一个正则表达式。仅仅因为/ ^ $ /?
答案 0 :(得分:1)
实际上你不能这样做,因为在route
声明中regex
被简化了,它只接受一个模式字符串,它不应该包含^$
,因为当编译路由时按Symfony\Component\Routing\Route
类;它只是从该字符串中删除^
和$
,如果您提供斜杠/.../
,则该路由将不起作用。因此,您无法在/^[...]$/
声明中使用route
之类的正则表达式。在Symfony\Component\Routing\Route
课程中,您可以找到这样的方法(准备路线的regex
):
private function sanitizeRequirement($key, $regex)
{
if (!is_string($regex)) {
throw new \InvalidArgumentException(sprintf('Routing requirement for "%s" must be a string.', $key));
}
if ('' !== $regex && '^' === $regex[0]) {
$regex = (string) substr($regex, 1); // returns false for a single character
}
if ('$' === substr($regex, -1)) {
$regex = substr($regex, 0, -1);
}
if ('' === $regex) {
throw new \InvalidArgumentException(sprintf('Routing requirement for "%s" cannot be empty.', $key));
}
// ...
return $regex;
}
另一方面,Validator
需要有效的正则表达式,您需要指定/^[...]$/
之类的正则表达式。因此,对于regex
和Route
使用相同的Validator
是不可能的,因为它们是不同的,并且工作方式不同。
即使两者都相同,也没有内置方法可以将regex
中的路由Validator
模式应用为rule
。保持简单,使用它们的工作方式,不要太复杂。