Composer插件发布自动加载转储太晚了

时间:2016-01-25 14:49:56

标签: php plugins composer-php

我正在尝试为我正在构建的模块化框架编写一个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

但我无法弄清楚,因为没有堆栈跟踪。

我无法弄清楚我错过了什么。

1 个答案:

答案 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
        ]
    ];
}