来自模型和 Controller 的 cakephp 验证

标签 cakephp

我已经在模型中进行了验证。另外,我在 Controller 中进行了一些验证以检查验证码。之后,应用程序不会显示模型验证错误。如果我注释 Controller 代码,模型验证工作正常并显示错误。两个都不行。。

型号代码(示例)

class User extends AppModel {

var $name = 'User';

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

}

Controller 代码
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()) ,那么它也不起作用。

请帮忙

最佳答案

您的代码应该适用于 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.'
        )
    );
}

Controller :
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'); ?> 

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

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

Controller :
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;
    }
}

现在,您的 Controller 完全不知道您的模型如何验证其数据,甚至不知道数据的结构;并且您的表单验证都发生在模型中。

希望这可以帮助。

关于来自模型和 Controller 的 cakephp 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2507812/

相关文章:

php - CakePHP 3 - 创建隐藏字段

CakePHP 在错误的路径中搜索 DebugKit

php - 在 'country_id' 子句中获取列 'where' 是不明确的 - cakephp 1.3 中的搜索查询错误

cakephp - 使用条件过滤 HABTM 相关模型

php - Cake Console 无法在 Mac OS X Lion 上运行

在将 Debug模式更改为 2 之前,Cakephp 更新不会产生任何效果

php - 在 cakePHP 的页面顶部显示所有模型验证错误

mysql - CakePHP - 生成的查询无法与 SQL Server 一起正常工作

php - CakePHP 2.0 帐户验证

php - CakePHP 3 错误 : SQLSTATE[42000]: Syntax error or access violation: 1064