如何在CakePHP 3中使用beforeSave?必须始终填写$ event,$ entity和$ options?

I W*_*now 10 cakephp cakephp-3.0

我在"PostsTable.php"内部我正在尝试获取表单数据来处理图像文件.

在CakePHP 2中,我曾经做过:

public function beforeSave($options = array())
{
if(!empty($this->data['Post']['picture']['name'])...
Run Code Online (Sandbox Code Playgroud)

有人可以在Cake 3中解释这个:

beforeSave
Cake\ORM\Table::beforeSave(Event $event, Entity $entity, ArrayObject $options)
Run Code Online (Sandbox Code Playgroud)

添加

我尝试这段代码,看看我是否能够将这个字段保存在数据库上,就像测试一样,但似乎在忽略之前保存:

public function beforeSave($options)
{ 
if(!empty($entity->pic1['name'])) 
{ 
$entity->pic1 = 'jus a test';
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Nai*_*dim 9

从函数定义开始.

Cake\ORM\Table::beforeSave(Event $event, EntityInterface $entity, ArrayObject $options)
Run Code Online (Sandbox Code Playgroud)

由于CakePHP自动调用函数,因此调用它的方式,因此构建函数与函数定义完全相同:

// In PostsTable.php
public function beforeSave($event, $entity, $options) {

}
Run Code Online (Sandbox Code Playgroud)

如果您不确定要发送的数据,请使用CakePHP的debug()功能:

    debug($event); debug($entity); debug($options);
Run Code Online (Sandbox Code Playgroud)

找到正在$entity使用的数据后,您可以对数据执行以下操作:

    if (!empty($entity->picture['name'])) { ...
Run Code Online (Sandbox Code Playgroud)


bur*_*zum -3

让我为您阅读一下手册:

Model.beforeSave 事件在保存每个实体之前触发。停止此事件将中止保存操作。当事件停止时,将返回事件的结果。

还:

Model.beforeSave:将在计算要持久化的字段列表之前触发。它接收实体和选项作为参数。选项数组作为 ArrayObject 传递,因此其中的任何更改都将反映在每个侦听器中,并在事件结束时被记住,以便它可用于其余的保存操作。在任何侦听器中返回 false 都会中止保存过程。如果使用事件 API 停止事件,将返回事件对象的结果属性。当您在侦听器内实施自己的保存策略时,这会很有用。

要执行您之前在 Cake2 中所做的任何操作,您只需进行修改即可,$entity因为实体已替换了Model::$data属性。

if(!empty($entity->picture['name'])
Run Code Online (Sandbox Code Playgroud)

如果您不知道事件如何运作,请阅读相关内容迁移指南也是必读的。它列出了所有已更改的内容。