Laravel:Common Regex用于路由模式和模型验证

时间:2014-06-09 07:55:51

标签: regex laravel laravel-4 laravel-3

我遇到的情况: 请考虑以下情况:

  1. Route::pattern()或我们可以使用Route::({method}/{keyword})->where('keyword', {regex});
  2. 验证规则array( 'keyword' => "/^{regex}$/");
  3. 两者都接受不同格式的正则表达式 在案例1:Route::pattern()Route::()->where()中,它不接受/ ^ {regex} $ / format中的正则表达式。它只接受Route::pattern('keword', {regex})

    在案例2中:它接受/^{regex}$/模式中的正则表达式。

    所以简而言之,我不能在两个地方都应用同样的东西。这就是为什么我必须写两个不同的正则表达式,但它们是相同的。

    我错过了什么吗?是否可以立即定义模型正则表达式和路由模式正则表达式?所以改变一个正则表达式,我们不必改变另一个正则表达式。仅仅因为/ ^ $ /?

1 个答案:

答案 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需要有效的正则表达式,您需要指定/^[...]$/之类的正则表达式。因此,对于regexRoute使用相同的Validator是不可能的,因为它们是不同的,并且工作方式不同。

即使两者都相同,也没有内置方法可以将regex中的路由Validator模式应用为rule。保持简单,使用它们的工作方式,不要太复杂。