2016-01-23 112 views
2

在cakephp 3中,我們可以在任何模型中定義beforDelete事件偵聽器。但如何爲所有模型使用此事件。我希望在刪除所有存在模型中的一條記錄之前檢測所有級聯記錄條件。如何在cakephp 3中爲所有模型實現beforeDelete()事件

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中的這段代碼?

+1

您可以使用行爲,見http://book.cakephp.org/3.0/en/orm /behaviors.html –

+0

@N Nem您的回覆是正確的,請將其作爲回答。非常感謝你。 – omid

回答

1

我通常會創建行爲類並在其中添加將由大多數Table對象共享的功能。我不知道這是更好的方法,但這裏是我遵循的步驟。

首先用烘烤命令bin/cake bake behavior創建行爲類,這將創建正確的命名空間類,並在其中添加beforeDelete方法。 如果bake命令尚未添加,請將use ArrayObject; use Cake\Event\Event; use Cake\ORM\Entity;置頂 。

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

+0

這是*次優*解決方案。 *每個*單個模型都必須爲此而觸及。如果你添加插件,特別是你無法控制的外部插件,你不能插入行爲而不插入插件。我們的應用程序中有500張表格,這將是一項愚蠢而不必要的工作,可以將行爲添加到每一個模型中。如果需要更改,這不是很容易維護。此外,行爲也只是作爲事件的事件監聽器。直接在自定義偵聽器中偵聽事件會更容易,更方便。 – burzum

3

這很容易使用the event system。首先閱讀整個一章來了解事件。

  1. Create an event listener偵聽此事件
  2. 什麼就做什麼的聽衆回調方法想,有
  3. Attach the listener你的邏輯添加到全局事件管理器在bootstrap.php中
+0

感謝您的回覆。這是一個正常的和可接受的方法檢查「在所有模型刪除記錄條件之前」在蛋糕php或存在簡單的方法爲這個目標? – omid

+1

@omid這很簡單,因爲您甚至不需要觸摸模型層代碼。如果您想在您的應用程序中應用_every_單一模型的檢查,那麼此解決方案就完全沒問題。 – ndm