为什么这个函数可以在不使用Validator class的情况下验证用户输入?

Why this function is able to validate user input without using Validator class?

我正在研究一个 Laravel application,我发现这个应用程序有一些奇怪的行为。

此应用程序中有一些 Web 表单。大多数处理 POST 请求的控制器方法使用 Validator::make() 来验证用户输入,但我发现 2 个方法根本不使用 Validator::make()

起初我以为这2个表单没有输入验证。然而,令人惊讶的是,我发现网络表单仍然能够验证用户输入。

示例 1: (使用验证器)

  1. Controller Method 1(第 60 - 67 行)
  2. Controller Method 2(第 62 - 68 行)

$rules = array(
    'title'   => 'required|min:3',
    'content' => 'required|min:3'
);
...
$validator = Validator::make(Input::all(), $rules);

示例 2: (未使用验证器)

  1. Controller Method 3(第 89 - 111 行)
  2. Controller Method 4(第 27 - 47 行)

$this->user->username = Input::get( 'username' );
$this->user->email = Input::get( 'email' );
$this->user->password = Input::get( 'password' );
...
$this->user->save();

我想知道为什么 示例 2 中的函数能够在不使用 Validator 的情况下验证用户输入?

此应用程序的用户模型使用 ConfideUser 特征。如果我们看一下 trait in the confide package,我们可以看到有一个 save() 方法覆盖了 Laravel.

中的默认方法
/**
 * Overwrites the original save method in order to perform
 * validation before actually saving the object.
 *
 * @param array $options
 *
 * @return bool
 */
public function save(array $options = array())
{
    if ($this->isValid()) {
        return parent::save($options);
    }
    return false;
}

它将调用 $this->isValid() 并且只有在一切正常时才会保存。这里是 isValid():

/**
 * Checks if the current user is valid using the ConfideUserValidator.
 *
 * @return bool
 */
public function isValid()
{
    // Instantiate the Zizaco\Confide\UserValidator and calls the
    // validate method. Feel free to use your own validation
    // class.
    $validator = App::make('confide.user_validator');
    // If the model already exists in the database we call validate with
    // the update ruleset
    if ($this->exists) {
        return $validator->validate($this, 'update');
    }
    return $validator->validate($this);
}

它创建了一个 confide 自己的实例 UserValidator 并使用它来验证当前模型。