2016-01-25 2 views
1

Я пытаюсь написать плагин композитора для модульной структуры, которую я создаю, чтобы каждый модуль был проверен и зарегистрирован после сброса автозагрузчика.Composer плагин post автозагрузка дампа срабатывает слишком поздно

Если я вручную запускаю скрипт через оболочку в "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 для регулярного Event и Я попытался изменить тип события на onPreFileDownload.

Иногда он будет бросать:

[ErrorException]  
Undefined offset: 0 

Но я не могу понять это либо нет трассировки стека.

Я не могу понять, что мне не хватает.

ответ

0

Это не очевидно (по крайней мере, для меня) в документации, но все, что вам нужно сделать, это:

Чтобы зарегистрировать метод к событию, просто возвращает массив, где ключ имя события (перечисленные здесь), а значение - это имя метода в этом классе, который будет вызываться.

/** 
* @return array 
*/ 
public static function getSubscribedEvents() 
{ 
    return [ 
     'post-autoload-dump' => 'methodToBeCalled', 
     //^event name^  ^method name^     
    ]; 
} 

По умолчанию, приоритет обработчика события устанавливаются в 0. агентом PRIORITY может быть изменен путем присоединения кортежа, где первое значением является именем метода, как и прежде, а второе значение представляет собой целое число, представляющее приоритет. Более высокие числа представляют собой более высокие priorityes, следовательно, priortity 2 вызывается перед приоритетом 1 и т.д.

/** 
* @return array 
*/ 
public static function getSubscribedEvents() 
{ 
    return [ 
     // Will be called before events with priority 0 
     'post-autoload-dump' => ['methodToBeCalled', 1] 
    ]; 
} 

Если несколько методов следует назвать, то массив tupples может быть прикреплен к каждому событию. Корреспондентам не нужно включать приоритет. Если он опущен, то по умолчанию будет 0.

/** 
* @return array 
*/ 
public static function getSubscribedEvents() 
{ 
    return [ 
     'post-autoload-dump' => [ 
      ['methodToBeCalled'  ], // Priority defaults to 0 
      ['someOtherMethodName', 1], // This fires first 
     ] 
    ]; 
} 
+0

Вы на самом деле нужно только изменить 'PluginEvents :: command' к' 'пост-автозагрузку-dump'', остальное нормально, но я думаю, что это шоу более простой способ. – DanielM

+0

Я не уверен, где это противоречит документации ...? –

+0

Вы правы, я просто нашел документацию бесполезной. Пример сложный, имя события скрыто константой (и нет никакой константы, которую я мог бы найти для событий «Command» (кроме события с именем 'command'), и метод называется почти тем же, что и событие. Кроме того, они имеют приоритет, установленный в примере (который в конкретном примере бессмыслен, поскольку по умолчанию 0) еще больше беспокоит меня. Я обновил свой ответ, чтобы объяснить все это. Возможно, они увидят это и обновят их. – DanielM

Смежные вопросы