gpt4 book ai didi

cakephp-3.0 - beforeMarshal 验证失败时不修改请求数据

转载 作者:行者123 更新时间:2023-12-01 09:54:27 37 4
gpt4 key购买 nike

错误还是功能?如果我用 beforeMarshal 更改请求数据并且出现验证错误,则请求数据将不会被修改。

此问题可能与 How to use Trim() before validation NotEmpty? 有关.

Modifying Request Data Before Building Entities If you need to modify request data before it is converted into entities, you can use the Model.beforeMarshal event. This event lets you manipulate the request data just before entities are created. Source: CakePHP 3 Documentation

根据这本书,我希望请求数据总是会更改,无论是否存在验证错误。

示例或测试用例:

// /src/Model/Table/UsersTable.php
namespace App\Model\Table;
use Cake\ORM\Table;
// Required for beforeMarshal event:
use Cake\Event\Event;
use ArrayObject;
// Required for Validation:
use Cake\Validation\Validator;

class UsersTable extends Table {

public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options) {
$data['firstname'] = trim($data['firstname']);
}

public function validationDefault(Validator $validator) {
$validator
->add('firstname', [
'minLength' => [ 'rule' => ['minLength', 2], 'message' => 'Too short.' ],
])
;
return $validator;
}
}

如果我输入“d”(空格-d),则会显示验证错误,但空格本身不会在表单中删除。我会解释只显示“d”的表单,因为空间是通过 beforeMarshal 事件从请求数据中删除的。那么...错误或功能?

我的解决方案是在 Controller 中使用 trim() 函数而不是 beforeMarshal 事件:

// /src/Controller/UsersController.php
// ...
public function add() {
$user = $this->Users->newEntity();
if ($this->request->is('post')) {
// Use trim() here instead of beforeMarshal?
$this->request->data['firstname'] = trim($this->request->data['firstname']);
$user = $this->Users->patchEntity($user, $this->request->data );
if ( $this->Users->save($user) ) {
$this->Flash->succeed('Saved');
return $this->redirect(['controller' => 'Users', 'action' => 'index']);
} else {
$this->Flash->error('Error');
}
}
$this->set('user', $user);
}

这样即使出现验证错误,空格也会被删除。还是我错过了另一个类似于 beforeMarshal 的真正修改请求数据的函数?

最佳答案

beforeMarshal 的主要目的是帮助用户通过验证过程,当简单的错误可以自动解决,或者当数据需要重组以便放入正确的列时。

beforMarshal 事件仅在验证过程开始时触发,原因之一是允许 beforeMarshal 更改验证规则和保存选项,比如字段白名单。此事件完成后立即触发验证。

正如文档所解释的,如果一个字段没有通过验证,它将自动从数据数组中删除并且不会被复制到实体中。这是为了防止实体对象中的数据不一致。

此外,beforeMarshal 中的数据是请求的副本。这是因为保留原始用户输入很重要,因为它可能会在其他地方使用。

如果您需要修剪列并向用户显示修剪结果,我建议在 Controller 中进行:

$this->request->data = array_map(function ($d) {
return is_string($d) ? trim($d) : $d;
}, $this->request->data);

关于cakephp-3.0 - beforeMarshal 验证失败时不修改请求数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31197051/

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