【问题标题】:Cakephp validation does not workCakephp 验证不起作用
【发布时间】:2018-07-10 13:42:14
【问题描述】:

我在 Cakephp 3.6 下遇到表单验证问题

在旧版本的 CakePHP 上验证没有问题,但是没有办法通过模型验证我的表单。 我按照不同站点的教程,在论坛上查看,任何解决方案都不起作用。 如果我没记错的话,在我看来,在 CakePHP 3 的第一个版本上,验证是在保存时进行的,即使没有输入数据,我也会进行没有任何价值的保存。 ..

我的看法:

//src/Template/Users/Register.ctp

<div class="wrapper">
    <div id="register-box">
        <div class="form-register">
            <h2 class="title">Inscription</h2>
            <?php
            echo $this->Form->create();
            echo $this->Form->control('email',[
                'label'         => false,
                'placeholder'   => 'Adresse email',
                'class'         => 'form-control',
                //'required'      => true
            ]);

            echo $this->Form->control('username',[
                'label'         => false,
                'placeholder'   => 'Nom d\'utilisateur',
                'class'         => 'form-control',
            ]);

            echo '<div class="form-group">';
            echo $this->Form->control('lastname',[
                'label'         => false,
                'placeholder'   => 'Nom',
                'class'         => 'form-control w-50',
            ]);

            echo $this->Form->control('firstname',[
                'label'         => false,
                'placeholder'   => 'Prénom',
                'class'         => 'form-control w-50',
            ]);
            echo '</div>';

            echo $this->Form->control('password',[
                'label'         => false,
                'placeholder'   => 'Mot de passe',
                'class'         => 'form-control',
            ]);

            echo $this->Form->select('type',
                [
                    1           => 'Prestataire',
                    2           => 'Client'
                ],
                [
                    'empty'     => 'Quel type de compte ?',
                    'class'     => 'form-control',
                ]);

            echo $this->Form->button('Suivant', ['class'    => 'btn btn-red']);
            echo $this->Form->end();
            ?>
        </div>
    </div>
</div>

我的控制器:

//src/Controller/UsersController.php

<?php
namespace App\Controller;

use App\Controller\AppController;
use Cake\Validation\Validator;

class UsersController extends AppController {
    public function register() {
        $user = $this->Users->newEntity();
        if($this->request->is('post')) {
            $user = $this->Users->patchEntity($user, $this->request->getData());
            if($this->Users->save($user)) {
                echo "ok";
            } else {
                echo "KO";
            }

        }
        $this->set('user', $user);
    }
}

还有我的模型表:

//src/Model/Table/UsersTable.php

<?php
use Cake\ORM\Table;
use Cake\Validation\Validator;
class UsersTable extends Table {

    public function initialize(array $config) {
        $this->addBehavior('Timestamp');
    }

    public function validationDefault(Validator $validator)
    {
        return $validator
            ->notEmpty('username', "Un nom d'utilisateur est nécessaire")
            ->notEmpty('password', 'Un mot de passe est nécessaire');
    }
}

关于如何对用户注册应用验证的想法?

谢谢

【问题讨论】:

  • 乍一看,这一切看起来都不错。当你运行这个时你会得到什么结果?如果你在patchEntity 调用之后debug($user);,你会得到什么?
  • 除了与表单相关的数据我什么都不是,没有错误... src\Controller\UsersController.php (line 13) object(Cake\ORM\Entity) { 'email' => ' ', 'username' => '', 'lastname' => '', 'firstname' => '', 'password' => '', 'type' => '', '[new]' => true , '[accessible]' => [ '*' => true ], '[dirty]' => [ 'email' => true, 'username' => true, 'lastname' => true, 'firstname' = > true, 'password' => true, 'type' => true ], '[original]' => [], '[virtual]' => [], '[errors]' => [], '[无效]' => [], '[存储库]' => '用户'

标签: php cakephp cakephp-3.0


【解决方案1】:

您必须将命名空间添加到您的用户表中

<?php
namespace App\Model\Table; /// <<< add this line

use Cake\ORM\Table;
use Cake\Validation\Validator;

class UsersTable extends Table
{

    public function initialize(array $config)
    {
        $this->addBehavior('Timestamp');
    }

    public function validationDefault(Validator $validator)
    {
        return $validator
            ->notEmpty('username', "Un nom d'utilisateur est nécessaire")
            ->notEmpty('password', 'Un mot de passe est nécessaire');
    }
}

【讨论】:

    【解决方案2】:

    patchEntity 将首先验证您的数据,然后才返回实体对象

    来源:https://book.cakephp.org/3.0/en/orm/saving-data.html#validation-and-patchentity

    【讨论】:

    • 我刚试过这个方法,结果一模一样,给我留个空表格和0个错误...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多