我正在尝试为我正在构建的模块化框架编写一个composer插件,以便在自动加载器被转储后检查并注册每个模块。
如果我通过"scripts"
composer.json
部分中的包装器手动运行脚本,它似乎可以正常工作,但插件不会触发事件。
这是仅限于该事件的插件的缩减版本。
<?php
namespace My\Namespace;
use Composer\Composer;
use Composer\Config;
use Composer\EventDispatcher\EventSubscriberInterface;
use Composer\IO\IOInterface;
use Composer\Plugin\PluginEvents;
use Composer\Plugin\PluginInterface;
use Composer\Script\CommandEvent;
class Plugin implements PluginInterface, EventSubscriberInterface
{
/**
* @param Composer $composer
* @param IOInterface $io
*/
public function activate(Composer $composer, IOInterface $io) { }
/**
* Once the autoloader has been dumped
* @param Event $event
*/
public function onPostAutoloadDump(CommandEvent $event)
{
$event->getIO()->write('Autoload dumped.');
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
PluginEvents::COMMAND => [
['onPostAutoloadDump' => 0]
]
];
}
}
插件文档位于:https://getcomposer.org/doc/articles/plugins.md
事件名称位于:https://getcomposer.org/doc/articles/scripts.md#event-names
composer.json包含
{
...
"type": "composer-plugin",
"extra": {
"class": "My\\Namespace\\Plugin"
},
...
}
我尝试更改常规CommandEvent
的{{1}},并尝试将事件类型更改为Event
。
有时它会抛出:
onPreFileDownload
但我无法弄清楚,因为没有堆栈跟踪。
我无法弄清楚我错过了什么。
答案 0 :(得分:0)
在文档中并不明显(至少对我而言),但您需要做的就是:
要向方法注册方法,只需返回一个数组,其中键是事件名称(此处列出),值是要调用的此类中方法的名称。
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'post-autoload-dump' => 'methodToBeCalled',
// ^ event name ^ ^ method name ^
];
}
默认情况下,事件处理程序的优先级设置为0.可以通过附加第一个值为方法名称的元组来更改priorty,如前所述,第二个值是表示优先级的整数。较高的整数表示较高的优先级,因此,优先级2在优先级1之前调用,等等。
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
// Will be called before events with priority 0
'post-autoload-dump' => ['methodToBeCalled', 1]
];
}
如果应该调用多个方法,则可以为每个事件附加一个tupple数组。 tupples不需要包含优先级。如果省略,则默认为0。
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'post-autoload-dump' => [
['methodToBeCalled' ], // Priority defaults to 0
['someOtherMethodName', 1], // This fires first
]
];
}