模型和控制器的cakephp验证

时间:2010-03-24 13:04:28

标签: cakephp

我已经在模型中进行了验证。此外,我已在控制器中进行了一些验证以检查验证码。之后,应用程序不显示模型验证错误。如果我评论控制器代码,模型验证工作正常并显示错误。两者都不起作用..

模型代码(样本)

class User extends AppModel {

var $name = 'User';

var $validate = array(
    'username' => 'notempty',
    'firstname' => 'notempty'
    );

}

控制器代码

if (!empty($this->data)) {

$this->User->set($this->data);
$this->User->create();
$captcha = $this->Session->read('CAPTCHA_CODE');

if (strtolower($captcha) != strtolower($this->data['User']['captcha']))
{
    $this->User->invalidate('captcha', __('Sorry, your entry did not match', true));
}

if ($this->User->save($this->data, array('validate' => 'only')))
{
    if ($this->User->save($this->data, array('validate' => 'false'))) {
        $this->Session->setFlash(__('Registered successfully', true));
        $this->redirect('success');
    }
}else {
    $this->Session->setFlash(__('Please, try again.', true));
}

}

我已将if ($this->User->save($this->data, array('validate' => 'only')))行替换为if ($this->User->validates()),然后它也无效。

请帮助

1 个答案:

答案 0 :(得分:11)

您的代码应与if ( $this->User->validates() )一起使用。您遇到问题的不正确行为是因为Model::save()重置Model::validationErrors成员,从而消除了您的自定义验证错误。 Model::validates()没有,因此您的双重验证设置应该有效。

例如,以下函数在CakePHP 1.2下正确运行。

型号:

class User extends AppModel
{
    var $validate = array(
        'my_other_field' => array(
            'rule' => 'notEmpty',
            'message' => 'This field should not be empty.'
        )
    );
}

控制器:

class UsersController extends AppModel
{
    function add()
    {
        if (! empty($this->data)) {
            $this->User->set( $this->data );

            if ( 'foo' != $this->data['User']['my_field'] ) {
                $this->User->invalidate( 'my_field', 'Should be "foo".' );
            }

            if ( $this->User->validates() ) {
                $this->flash('Form validated correctly.'); exit;
            }
        }
    }
}

查看:

<?php echo $form->create('User', array('action'=>'add')); ?> 
<?php echo $form->input('User.my_field', array('value'=>'bar')); ?> 
<?php echo $form->input('User.my_other_field', array('value'=>'')); ?> 
<?php echo $form->end('Submit'); ?> 

按原样提交,表单验证错误出现在两个字段下面,一个来自控制器的验证逻辑,另一个来自模型的验证规则。

当然,更大的问题是通过让控制器处理一些数据验证来混淆MVC角色。你可能想要考虑这样的事情:

控制器:

class UsersController extends AppController
{
    function add()
    {
        if (! empty($this->data)) {

            $captcha = $this->Session->read('CAPTCHA_CODE');
            $this->User->setCaptchaCheck( $captcha );

            if ( $this->User->save( $this->data, array('validate'=>true))) {
                $this->Session->setFlash('Success');
                $this->redirect('success',303,true);
            }
        }
    }
}

型号:

class User extends AppModel
{
    var $captchaCheck = '';

    var $validates = array(
        'captcha' => array(
            'matchesCheck' => array(
                'rule' => array( 'matchesCaptchaCheck', 'captchaCheck' ), // second value of array should match class member-name above
                'message' => "CAPTCHAs don't match."
            )
        )
    );

    function matchesCaptchaCheck( $data, $checkVar )
    {
        $data = reset(array_values($data)); // I don't need to know the field name now.

        return low($data) == low($this->{$checkVar});
    }

    function setCaptchaCheck( $captcha )
    {
        $this->captchaCheck = $captcha;
    }
}

现在,您的控制器对您的模型如何验证其数据,甚至数据的结构方式一无所知;并且您的表单验证都发生在模型中。

希望这有帮助。