我有一个beforeSave
- 回调,每当我创建一个新实体时都会调用它。但是当我编辑时,它根本就没有被调用。
在文档中找不到任何可能有用的内容。
这是我的编辑功能:
public function edit($id = null) {
if (!$id) {
throw new NotFoundException(__('Invalid article'));
}
$article = $this->Articles->get($id);
if ($this->request->is(['post', 'put'])) {
$this->Articles->patchEntity($article, $this->request->data);
if ($this->Articles->save($article)) {
$this->Flash->success(__('Your article has been updated.'));
return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__('Unable to update your article.'));
}
$this->set('article', $article);
}
答案 0 :(得分:14)
仅当您发布/编辑的数据被修改时,才会触发beforeSave
功能。
//triggers only if an entity has been modified
public function beforeSave(Event $event, Entity $entity)
{
if($entity->isNew()) {
//on create
} else {
//on update
}
}
答案 1 :(得分:0)
是的,您需要使用Event
和Entity
对象:
检查此示例:
// src/Model/Table/ArticlesTable.php
use Cake\Event\Event;
use Cake\ORM\Entity;
public function beforeSave(Event $event, Entity $entity) {
if ($entity->isNew()) {
return true;
}
// edit code
}
答案 2 :(得分:0)
另一种编写相同代码的方式:
public function beforeSave(\Cake\Event\Event $event, \Cake\ORM\Entity $entity, \ArrayObject $options){
if($entity->isNew()) {
// on create
} else {
// on update
}
}
答案 3 :(得分:0)
我也遇到了教程卡在这一点上的问题,但我使用 bin/cake bake 命令自动生成了 ArticlesTable 代码并添加了这个验证器:
$validator
->scalar('slug')
->maxLength('slug', 191)
/*->requirePresence('slug', 'create')*/
->notEmptyString('slug')
->add('slug', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']);
当我评论 requirePresence() 时,它为我解决了这个问题。如果您使用 requirePresence('fieldName', 'create') 进行验证,则在创建新文章实体时,如果帖子中没有该字段,您将收到错误消息。