簡體   English   中英

檢查事件是否來自插件內的 model?

[英]Check if event is coming from a model inside a plugin?

我需要自定義 CakePHP 插件中的所有模型來使用數據庫前綴。 正如@lorenzo 所建議的,我正在嘗試使用一個事件。

EventManager::instance()->on('Model.initialize', function ($event) {
    $instance = $event->subject();
    $instance->table('prefix_' . $instance->table());
});

我從我的插件 model 以及 DebugKit 模型中獲得了多個回調,它可能是應用程序中的其他模型。

有沒有辦法判斷給定的$event是否來自插件?

我已經檢查$event->getSubject()並且它包含相應的表 class。我能想到的唯一可行的方法是檢查插件名稱的一些屬性。

  • $event->getSubject()->getRegistryAlias()ExamplePlugin.Posts
  • $event->getSubject()->getEntityClass()ExamplePlugin\Model\Entity\Post

我可以檢查是否以ExamplePlugin 有沒有更好的辦法?

事實上,基本上任何 PHP 命名空間都可以是一個插件,這意味着你可以這樣做:

EventManager::instance()->on('Model.initialize', function (\Cake\Event\EventInterface $event) {
    /** @var \Cake\ORM\Table $object */
    $object = $event->getSubject();
    $tableClassName = get_class($object);
    $isApp = str_starts_with($tableClassName, 'App');
});

因為您的主應用程序的命名空間將始終以App開頭

這當然不會區分位於plugins中的私有插件和通過 composer 安裝並因此位於vendor目錄中的插件。

但是您可以為所有私有插件引入一個名稱前綴,這樣您就可以輕松地將它們與任何其他插件區分開來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM