gpt4 book ai didi

validation - CakePHP3 中令人困惑的验证与应用程序规则

转载 作者:行者123 更新时间:2023-12-04 12:19:46 24 4
gpt4 key购买 nike

多个关于验证的问题可能属于一起,因为它们都涉及 CakePHP 3 中的新验证概念。

我已经多次阅读食谱中的章节( 123 ),但老实说我不明白如何以正确的方式去做。我也知道目前有一个 issue/discussion at GitHub关于 CakePHP3 中的 Validation 可能涉及相同的主题。

触发验证错误,例如与补丁实体。所以我认为最好在执行保存操作之前始终检查/显示错误:

// src/Controller/UsersController.php
public function add() {
$user = $this->Users->newEntity();
if ($this->request->is('post')) {
$user = $this->Users->patchEntity($user, $this->request->data, ['validate' => 'default'] );
if ( $user->errors() ) {
$this->Flash->error('There was a Entity validation error.');
} else {
// Optional: Manipulate Entity here, e.g. add some automatic values
// Be aware: Entity content will not be validated again by default
if ( $this->Users->save($user) ) {
$this->Flash->succeed('Saved successfully.');
return $this->redirect(['controller' => 'Users', 'action' => 'index']);
} else {
$this->Flash->error('Not saved - ApplicationRule validation error.');
}
}
}
$this->set('user', $user);
}

为什么食谱教程不使用 $user->errors()在保存数据之前?据我了解 save如果已经存在验证错误,则不需要调用?!另一种方法是结合错误检查和保存操作:

if ( !$user->errors() && $this->Users->save($user) ) {
$this->Flash->succeed('Saved successfully.');
return $this->redirect(['controller' => 'Users', 'action' => 'index']);
} else {
$this->Flash->error('There was a validation OR ApplicationRule error.');
}

你在用这个吗?我应该使用它吗?或者如果没有,为什么不呢?

为什么即使我不使用 CakePHP 也会显示验证错误 $user->errors()在 Controller 中,就像在所有食谱示例中一样?我以为 save不会检查实体验证?!

示例:isUnique

根据 cookbook “确保电子邮件唯一性”是应用程序规则的一个用例。

// src/Model/Table/UsersTable.php
namespace App\Model\Table;
use Cake\ORM\Table;
use Cake\ORM\RulesChecker;
use Cake\ORM\Rule\IsUnique;
// Application Rules
public function buildRules(RulesChecker $rules) {
$rules->add($rules->isUnique(['email'], 'This email is already in use'));
return $rules;
}

该错误只会由 save 触发- 调用 Controller 。但也可以在验证中检查唯一性。为什么最好不要这样做?

// src/Model/Table/UserTable.php
namespace App\Model\Table;
use Cake\ORM\Table;
use Cake\Validation\Validator;
public function validationDefault(Validator $validator) {
$validator
->add('email', [
'unique' => [
'rule' => 'validateUnique',
'provider' => 'table',
'message' => 'This email is already in use'
],
])
return $validator;
}

如果我可以在验证中添加 ApplicationRule,我为什么会/应该使用 ApplicationRules?

如何在 ApplicationRule 中定义何时应仅在特定操作(并非所有创建/更新调用)中应用规则?

当实体在 patchEntity 之后被操作时,我也没有看到或理解这两个分离的验证状态的好处。 -称呼。

如果我自动向实体添加一些值,我想确保这些值在将它们保存到数据库之前仍然有效(如在 CakePHP2 中)。所以我猜 更好/更重要永远 Using Validation as Application Rules ?!

你一般如何处理这个问题?是否有其他示例可用于展示/演示验证与应用程序规则的好处和一些用例?

最佳答案

我认为您感到困惑的主要来源是您不知道 save()如果实体已经包含错误,则不会保存实体。例如:

$entity = $users->newEntity(['email' => 'not an email']);
$users->save($entity); // Returns false

它会返回 false 的原因是因为 save()阅读 $entity->errors()在进行实际的保存过程之前,结果。因此,在调用 save() 之前不需要手动检查错误。 ,正如手册中的示例所示。

电子邮件唯一性示例有点棘手,因为您需要检查面向用户的表单(验证的目标是什么)和应用程序规则。

重要的是要记住 Validation ,如 validation*()方法,旨在向人类提供有关他们提供的数据的反馈。您想在保存过程开始之前在表单中显示所有错误(包括嵌套属性的错误)。

Validation很少发生在数据库事务中,没有实际保证验证和保存电子邮件之间仍然是唯一的。这是应用程序规则试图解决的问题之一:应用程序规则确实与保存过程的其余部分在同一事务中运行,因此任何检查都将具有一致性保证。

应用程序规则解决的另一个问题是它们可以处理已经在实体上设置的数据,因此您可以完全访问对象的当前状态。在修补实体或创建新实体时,这是不可能的,因为任何传递的数据都可能不一致。

关于validation - CakePHP3 中令人困惑的验证与应用程序规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31087954/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com