如何在CakePHP 3.6中显示验证错误?

如何在CakePHP 3.6中显示验证错误?,php,validation,cakephp-3.x,Php,Validation,Cakephp 3.x,我在使用自定义验证器显示表单的验证错误时遇到问题。 错误确实存在,正如调试方法所示,它只是不会显示在表单中 我希望能够在字段下面(或上面,或任何地方)显示错误消息 我试过的 那么,这个国家呢, 使用View\Helper\FormHelper::control()时,错误由 默认设置,因此不需要使用isFieldError()或call error() 手动 尽管如此,我还是在表单中添加了以下内容(就在电子邮件控件的下方),这没有做更多的事情。没有显示任何消息 if ($this->For

我在使用自定义验证器显示表单的验证错误时遇到问题。 错误确实存在,正如调试方法所示,它只是不会显示在表单中

我希望能够在字段下面(或上面,或任何地方)显示错误消息

我试过的 那么,这个国家呢,

使用View\Helper\FormHelper::control()时,错误由 默认设置,因此不需要使用isFieldError()或call error() 手动

尽管如此,我还是在表单中添加了以下内容(就在电子邮件控件的下方),这没有做更多的事情。没有显示任何消息

if ($this->Form->isFieldError('email')) {
    echo $this->Form->error('email', 'Yes, it fails!');
}
我还发现了一些关于这个问题的问题和答案,但它们看起来过时了(从'09到'13),似乎与今天的CakePHP语法不符

我所做的 用户/忘记密码.ctp

<?= $this->Form->create() ?>
<?= $this->Form->control('email', ['type' => 'email']) ?>
<?= $this->Form->button(__('Reset my password')) ?>
<?= $this->Form->end() ?>
public function validationEmail(Validator $validator)
{
    $validator
        ->email('email')
        ->notEmpty('email', __('An email address is required.'));

    return $validator;
}
它看起来像什么

使现代化 感谢@ndm comment,以下是显示错误的正确方法

userscocontroller.php中:

public function forgotPassword()
{
    // user context for the form
    $user = $this->Users->newEntity();

    if ($this->request->is('post')) {

        $user = $this->Users->patchEntity(§user, $this->request->getData(), ['validate' => 'email']); <- validation done on patchEntity
        if ($user->errors()) {
            $this->Flash->error(__('An error occurred.'));
        } else {

          // ... procedure to reset password and redirect to login...

          return $this->redirect(['action' => 'login']);
        }
    }

    // pass context to view
    $this->set(compact('user'));
}
<?= $this->Form->create($user) ?>
public函数放弃密码()
{
//表单的用户上下文
$user=$this->Users->newEntity();
如果($this->request->is('post')){
$user=$this->Users->patchEntity(§user,$this->request->getData(),['validate'=>'email']);errors()){
$this->Flash->error(_uu(“发生了错误”);
}否则{
//…重置密码并重定向到登录的过程。。。
返回$this->redirect(['action'=>'login']);
}
}
//将上下文传递给视图
$this->set(压缩('user'));
}
并在视图中放弃密码.ctp

public function forgotPassword()
{
    // user context for the form
    $user = $this->Users->newEntity();

    if ($this->request->is('post')) {

        $user = $this->Users->patchEntity(§user, $this->request->getData(), ['validate' => 'email']); <- validation done on patchEntity
        if ($user->errors()) {
            $this->Flash->error(__('An error occurred.'));
        } else {

          // ... procedure to reset password and redirect to login...

          return $this->redirect(['action' => 'login']);
        }
    }

    // pass context to view
    $this->set(compact('user'));
}
<?= $this->Form->create($user) ?>

//按如下所示修改函数
公共函数forgotPassword()
{
如果($this->request->is('post')){
$user=$this->Users->newEntity($this->request->getData(),['validate'=>'email']);
如果($user->getErrors()){
调试($user->getError('email');//Flash->error($user->getError('email')[''u empty']);
}否则{
//…重置密码(工作正常!)并重定向到登录的过程。。。
返回$this->redirect(['action'=>'login']);
}
}
}

@ndm谢谢!我还没有看到解决我问题的答案。我确实错过了背景。现在一切都清楚了。这不是一个好主意,从每次规则更改时都必须调整控制器,到机器无法读取表单错误。控制器没有理由参与此操作,表单帮助器在输入正确数据时可以很好地处理错误。这并没有真正回答我关于如何在验证失败的字段下(或下一个)显示消息的问题。从用户体验的角度来看,我认为最好在失败字段旁边显示验证错误,而不是在flash消息中显示。正如@ndm提到的,这是一个糟糕的做法,因为每次规则或表单更改时都需要更新控制器方法。