如何在cakephp 3中为所有模型实现beforeDelete()事件

时间:2016-01-23 14:05:22

标签: cakephp cakephp-3.0

在cakephp 3中,我们可以在任何Model中定义beforDelete事件监听器。但是如何将此事件用于所有模型。我想在删除所有存在模型中的一条记录之前检测所有级联记录条件。

namespace App\Model\Table;

use Cake\ORM\Table;

class ArticlesTable extends Table{

    public function initialize(array $config)
     {
        $this->primaryKey('my_id');
     }

    public function beforeDelete(Event $event, EntityInterface $entity,ArrayObject $options)
    {
       return false;
    }
}

如何将此代码用于所有模型。应该是appcontroller中的这段代码吗?

3 个答案:

答案 0 :(得分:3)

使用the event system非常简单。阅读整个章节,先了解事件。

    听取此事件的
  1. Create an event listener
  2. 在侦听器回调方法中执行任何操作,在那里添加逻辑
  3. Attach the listener到bootstrap.php中的全局事件管理器

答案 1 :(得分:1)

我通常创建行为类并在那里添加将由大多数Table对象共享的功能。我不知道这是更好的方法,但这是我遵循的步骤。

首先使用bake命令bin/cake bake behavior创建行为类,这将创建正确的命名空间类,并在那里添加beforeDelete方法。 在顶部添加use ArrayObject; use Cake\Event\Event; use Cake\ORM\Entity; 如果bake命令尚未添加。

public function beforeDelete(Event $event, Entity $entity, ArrayObject $options){
    //your code goes here
   // $this->_table is Table object instance behavior is attached to
}

现在将行为附加到您的表类

class ArticlesTable extends Table{
    public function initialize(array $config)
    {
       $this->addBehavior('YourBehaviorNeme');
    }
}

有关详细信息,请参阅http://book.cakephp.org/3.0/en/orm/behaviors.html

答案 2 :(得分:0)

另一种适用于所有模型的解决方案是:

  1. 创建class MyTable extends Table
  2. 在该类中定义beforeDelete方法
  3. 使所有其他表类扩展MyTable