CakePHP 只验证模型的一部分
CakePHP validate only part of model
我想更新表单中特定模型的两个字段,并且只更新两个字段。同一模型上还有许多其他字段将在其他地方进行验证,但这两个字段位于单独的表单上。
我需要他们匹配并且都在场。 book_name_confirm
未保存在数据库中。
$validator
->scalar('book_name')
->maxLength('book_name', 255)
->requirePresence('book_name')
->sameAs('book_name_confirm', 'book_name', 'Book names must match')
->allowEmptyString('book_name', false);
最初创建记录时似乎工作正常...但是当仅更新这两个字段时,验证似乎不适用。
示例:
命名簿 "fluffy bunnies" 并确认并查看在数据库中创建的记录。验证按预期进行 - 在确认输入中输入任何其他内容 returns 设置错误。
进入书名更新页面。
输入不匹配的书名提交,保存新书名。没有抛出错误。可以在数据库中看到显示的新值。如果您尝试将其留空,会引发浏览器 "must not be blank" 错误。
表单本身:
<?= $this->Form->create($book) ?>
<fieldset>
<?php
echo $this->Form->control('book_name');
echo $this->Form->control('book_name_confirm', array('label' => 'Confirm book name'));
?>
</fieldset>
<?= $this->Form->button(__('Set new book name')) ?>
<?= $this->Form->end() ?>
控制器:
if ($this->request->is(['patch', 'post', 'put'])){
//bookTracking is passed through URL, is a UUID
$bookQuery = $this->Books->find('all')
->where(["tracking =" => $bookTracking]);
$book = $bookQuery->first();
//stuff here to handle missing books
$book->book_name = $this->request->getData("book_name");
$book->book_name_confirm = $this->request->getData("book_name_confirm");
$this->Books->save($book);
//redirect
}
$book = $this->Books->newEntity();
$this->set(compact('book'));
我想我可以在控制器中进行一些手动验证,但这似乎违背了设置整个验证模型的目的。我错过了什么?
当您直接设置值时,不执行验证;它假定您在制定这些价值观时知道自己在做什么。相反,使用 patchEntity
函数:
$book = $this->Books->patchEntity($book, $this->request->getData());
我想更新表单中特定模型的两个字段,并且只更新两个字段。同一模型上还有许多其他字段将在其他地方进行验证,但这两个字段位于单独的表单上。
我需要他们匹配并且都在场。 book_name_confirm
未保存在数据库中。
$validator
->scalar('book_name')
->maxLength('book_name', 255)
->requirePresence('book_name')
->sameAs('book_name_confirm', 'book_name', 'Book names must match')
->allowEmptyString('book_name', false);
最初创建记录时似乎工作正常...但是当仅更新这两个字段时,验证似乎不适用。
示例:
命名簿 "fluffy bunnies" 并确认并查看在数据库中创建的记录。验证按预期进行 - 在确认输入中输入任何其他内容 returns 设置错误。
进入书名更新页面。
输入不匹配的书名提交,保存新书名。没有抛出错误。可以在数据库中看到显示的新值。如果您尝试将其留空,会引发浏览器 "must not be blank" 错误。
表单本身:
<?= $this->Form->create($book) ?>
<fieldset>
<?php
echo $this->Form->control('book_name');
echo $this->Form->control('book_name_confirm', array('label' => 'Confirm book name'));
?>
</fieldset>
<?= $this->Form->button(__('Set new book name')) ?>
<?= $this->Form->end() ?>
控制器:
if ($this->request->is(['patch', 'post', 'put'])){
//bookTracking is passed through URL, is a UUID
$bookQuery = $this->Books->find('all')
->where(["tracking =" => $bookTracking]);
$book = $bookQuery->first();
//stuff here to handle missing books
$book->book_name = $this->request->getData("book_name");
$book->book_name_confirm = $this->request->getData("book_name_confirm");
$this->Books->save($book);
//redirect
}
$book = $this->Books->newEntity();
$this->set(compact('book'));
我想我可以在控制器中进行一些手动验证,但这似乎违背了设置整个验证模型的目的。我错过了什么?
当您直接设置值时,不执行验证;它假定您在制定这些价值观时知道自己在做什么。相反,使用 patchEntity
函数:
$book = $this->Books->patchEntity($book, $this->request->getData());