【问题标题】:How to use beforeSave in CakePHP 3? $event, $entity and $options must be always filled?如何在 CakePHP 3 中使用 beforeSave? $event、$entity 和 $options 必须始终填写?
【发布时间】:2015-05-08 12:56:46
【问题描述】:

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

在 CakePHP 2 中,我曾经这样做过:

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

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

beforeSave
Cake\ORM\Table::beforeSave(Event $event, Entity $entity, ArrayObject $options)

?

添加

我尝试了这个 sn-p 的代码,看看我是否能够将这个字段保存在数据库中作为测试,但似乎 beforeSave 被忽略了:

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

谢谢

【问题讨论】:

    标签: cakephp cakephp-3.0


    【解决方案1】:

    从函数定义开始。

    Cake\ORM\Table::beforeSave(Event $event, EntityInterface $entity, ArrayObject $options)
    

    因为 CakePHP 是自动调用函数的,所以它是这样被调用的,所以按照函数定义来构建你的函数:

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

    如果您不确定发送的是什么数据,请使用 CakePHP 的 debug() 函数:

        debug($event); debug($entity); debug($options);
    

    一旦您在 $entity 中找到您的数据,就可以使用它来对您的数据执行您想要执行的操作:

        if (!empty($entity->picture['name'])) { ...
    

    【讨论】:

      【解决方案2】:

      这是我使用的一个例子:

      use Cake\Event\Event;
      public function beforeSave(Event $event)
      {
          $entity = $event->getData('entity');
          if(!empty($entity->picture['name']){
             // your action here
          }
      }
      

      【讨论】:

        【解决方案3】:

        让我为你read the manual

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

        还有:

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

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

        if(!empty($entity->picture['name'])
        

        如果您不知道事件的工作原理read about themthe migration guide 也是必读的。它列出了所有已更改的内容。

        【讨论】:

        • 我已经改变了它,但 beforeSave 似乎被忽略了。我试过这个我添加到问题中只是作为一个测试,但名称没有设置。
        • @burzump 刚刚发生在这里是:我得到了我想要做的,但我使用 beforeMarshal 而不是 beforeSave。有什么问题吗?我只想将路径保存在数据库中,并将文件保存在文件夹中。但是 beforeSave 似乎被忽略了...
        • 阅读手册 ;) You can use the Model.beforeMarshal event to modify request data before it is converted into entities. 我不知道为什么它不适合你。
        猜你喜欢
        • 2016-12-27
        • 2015-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多