class FindCommandsCompilerPass

This compiler pass is added to Drupal's ContainerBuilder by our own subclass of DrupalKernel. Our DrupalKernel subclass knows which compiler passes to add because they are registered to it via its 'alter()' method. This happens in DrupalBoot8 immediately after the DrupalKernel object is created.

Having been thus added, this compiler pass will then be called during $kernel->boot(), when Drupal's dependency injection container is being compiled. Since we cannot use the container at this point (since its initialization is not yet complete), we instead alter the definition of a storage class in the container to add more setter injection method calls to 'addCommandReference'.

Later, after the container has been completely initialized, we can fetch the storage class from the DI container (perhaps also via injection from a reference in the container). At that point, we can request the list of Console commands that were added via the (delayed) call(s) to addCommandReference.





Expanded class hierarchy of FindCommandsCompilerPass


Contains filters are case sensitive


lib/Drush/Drupal/FindCommandsCompilerPass.php, line 33

View source
class FindCommandsCompilerPass implements CompilerPassInterface {
  protected $storageClassId;
  protected $tagId;

  public function __construct($storageClassId, $tagId) {
    $this->storageClassId = $storageClassId;
    $this->tagId = $tagId;

  public function process(ContainerBuilder $container) {
    drush_log(dt("process !storage !tag", ['!storage' $this->storageClassId '!tag' $this->tagId]), LogLevel::DEBUG);
    // We expect that our called registered the storage
    // class under the storage class id before adding this
    // compiler pass, but we will test this presumption to be sure.
    if (!$container->has($this->storageClassId)) {
      drush_log(dt("storage class not registered"), LogLevel::DEBUG);

    $definition = $container->findDefinition($this->storageClassId);

    $taggedServices = $container->findTaggedServiceIds($this->tagId);
    foreach ($taggedServices as $id => $tags) {
      drush_log(dt("found tagged service !id", ['!id' $id]), LogLevel::DEBUG);
      $definition->addMethodCall('addCommandReference', array(new Reference($id)));