CakePHP 3 - 如何在验证 NotEmpty 之前使用 Trim()?
CakePHP 3 - How to use Trim() before validation NotEmpty?
我的表单验证空字段,但如果用户使用 "space",验证如何处理一个字符.. 如何在 Model-Table 中使用 Trim()不会发生?
您可以使用 beforeRules 回调并在验证数据之前使用 trim ()。
我喜欢 trim 所有请求的一般数据。
这断言添加的无意义空格不会使验证失效:
public function startup(Event $event) {
// Data preparation
if (!empty($this->Controller->request->data) && !Configure::read('DataPreparation.notrim')) {
$this->Controller->request->data = $this->trimDeep($this->Controller->request->data);
}
if (!empty($this->Controller->request->query) && !Configure::read('DataPreparation.notrim')) {
$this->Controller->request->query = $this->trimDeep($this->Controller->request->query);
}
if (!empty($this->Controller->request->params['pass']) && !Configure::read('DataPreparation.notrim')) {
$this->Controller->request->params['pass'] = $this->trimDeep($this->Controller->request->params['pass']);
}
因此,在您的控制器或模型层中的任何地方使用它之前,可以使用这样的组件挂钩来清理您的数据。
您可以使用 beforeRules 回调并在验证数据之前使用 trim ()。
编辑:
一个简单的例子:
public function beforeRules($event, $entity, $options, $operation){
$entity->set ('yourFieldname', trim ($entity->get ('yourFieldname')));
return parent:: beforeRules($event, $entity, $options, $operation);
将此放入您的 table class。
假设您在帖子 table 中有一个标题列,并且您希望在验证之前 trim 标题。
将以下代码放入src\Model\Table\PostsTable.php
public function beforeMarshal(Event $event, ArrayObject $data)
{
$data['title'] = trim($data['title']);
}
并在 src\Model\Table\PostsTable.php
的顶部添加以下两行
use Cake\Event\Event;
use ArrayObject;
谢谢
如果要 trim 每条记录,需要在每个模型中添加 beforeMarshal
。
这是工作代码
// Include use statements at the top of your file.
use Cake\Event\Event;
use ArrayObject;
// In a table or behavior class
public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options)
{
foreach ($data as $key => $value) {
if (is_string($value)) {
$data[$key] = trim($value);
}
}
}
这里是cakephp的官方参考
https://book.cakephp.org/3.0/en/orm/saving-data.html#modifying-request-data-before-building-entities
我的表单验证空字段,但如果用户使用 "space",验证如何处理一个字符.. 如何在 Model-Table 中使用 Trim()不会发生?
您可以使用 beforeRules 回调并在验证数据之前使用 trim ()。
我喜欢 trim 所有请求的一般数据。 这断言添加的无意义空格不会使验证失效:
public function startup(Event $event) {
// Data preparation
if (!empty($this->Controller->request->data) && !Configure::read('DataPreparation.notrim')) {
$this->Controller->request->data = $this->trimDeep($this->Controller->request->data);
}
if (!empty($this->Controller->request->query) && !Configure::read('DataPreparation.notrim')) {
$this->Controller->request->query = $this->trimDeep($this->Controller->request->query);
}
if (!empty($this->Controller->request->params['pass']) && !Configure::read('DataPreparation.notrim')) {
$this->Controller->request->params['pass'] = $this->trimDeep($this->Controller->request->params['pass']);
}
因此,在您的控制器或模型层中的任何地方使用它之前,可以使用这样的组件挂钩来清理您的数据。
您可以使用 beforeRules 回调并在验证数据之前使用 trim ()。
编辑: 一个简单的例子:
public function beforeRules($event, $entity, $options, $operation){
$entity->set ('yourFieldname', trim ($entity->get ('yourFieldname')));
return parent:: beforeRules($event, $entity, $options, $operation);
将此放入您的 table class。
假设您在帖子 table 中有一个标题列,并且您希望在验证之前 trim 标题。
将以下代码放入src\Model\Table\PostsTable.php
public function beforeMarshal(Event $event, ArrayObject $data)
{
$data['title'] = trim($data['title']);
}
并在 src\Model\Table\PostsTable.php
的顶部添加以下两行use Cake\Event\Event;
use ArrayObject;
谢谢
如果要 trim 每条记录,需要在每个模型中添加 beforeMarshal
。
这是工作代码
// Include use statements at the top of your file.
use Cake\Event\Event;
use ArrayObject;
// In a table or behavior class
public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options)
{
foreach ($data as $key => $value) {
if (is_string($value)) {
$data[$key] = trim($value);
}
}
}
这里是cakephp的官方参考 https://book.cakephp.org/3.0/en/orm/saving-data.html#modifying-request-data-before-building-entities