【问题标题】:How to validate partially a model in cakephp 3如何在 cakephp 3 中部分验证模型
【发布时间】:2016-04-18 11:24:19
【问题描述】:

我想验证模型的某些字段,因为我正在实施多步骤表单。 CakePHP 2 中的This method 在版本 3 中不起作用。如何继续?

【问题讨论】:

    标签: php validation cakephp-3.0


    【解决方案1】:

    请参阅using a different validation set 上的文档。您将需要设置验证表单每个步骤的函数,并指定在 newEntitypatchEntity 调用中使用哪个函数。对于多步骤表单,第二步的验证可能会添加第一步的验证,以确保没有篡改之间的数据。所以,你会有这样的东西:

    在步骤1的控制器功能中:

    $entity = $table->newEntity(
        $this->request->data,
        ['validate' => 'step1']
    );
    

    在第二步的控制器函数中:

    $entity = $table->newEntity(
        $this->request->data,
        ['validate' => 'step2']
    );
    

    等等

    在你的表类中:

    public function validationStep1($validator)
    {
        $validator
            ->add('email', 'notEmpty', [
                'rule' => 'notEmpty',
                'message' => __('Provide a valid email'),
            ])
            ->add('username', 'notEmpty', [
                'rule' => 'notEmpty',
                'message' => __('Provide a valid username')
            ]);
        return $validator;
    }
    

    (可能还有其他验证,例如确保电子邮件地址有意义)。

    然后

    public function validationStep2($validator)
    {
        $validator = $this->validationStep1($validator)
            ->add('first_name', 'notEmpty', [
                'rule' => 'notEmpty',
                'message' => __('Provide your first name'),
            ]);
        return $validator;
    }
    

    等等。

    【讨论】:

      【解决方案2】:

      是的,看起来在蛋糕 3 中他们摆脱了 validates() 方法。只有当您调用newEntitypatchEntity 时才会触发验证。如果逐个验证很重要,您可能需要分别修补每个字段并在每个字段后检查错误。

      $userEntity = $usersTable->newEntity();
      $userEntity = $usersTable->patchEntity(['email' => 'not an email!!']);
      if($userEntity->errors('email')){
          return false; // Invalid email
      }
      

      根据

      http://book.cakephp.org/3.0/en/orm/validation.html#using-validation-as-application-rules

      【讨论】:

      • 多个字段怎么样?我继续这样if($userEntity->errors(['email', 'username'])),但仍然收到有关所有其他字段的消息。
      • 嗯,很有趣。也许试试link$errors = $validator->errors($this->request->data()); if (isset($errors['email'])) { return false; }
      猜你喜欢
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多