[英]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.