11.07.2022・TechStuff
11.07.2022・TechStuff

MessengerPass::getServiceClass() must be of the type string, null returned

Fabian Blechschmidt

You are implement a scheduled task in Shopware 6 and get a weird error message?

-> % ddev console scheduled-task:register
TypeError {#12307
  #message: "Return value of Symfony\Component\Messenger\DependencyInjection\MessengerPass::getServiceClass() must be of the type string, null returned"
  #code: 0
  #file: "./vendor/symfony/messenger/DependencyInjection/MessengerPass.php"
  #line: 394
  trace: {
    ./vendor/symfony/messenger/DependencyInjection/MessengerPass.php:394 { …}
    ./vendor/symfony/messenger/DependencyInjection/MessengerPass.php:86 { …}
    ./vendor/symfony/messenger/DependencyInjection/MessengerPass.php:71 { …}
    ./vendor/symfony/dependency-injection/Compiler/Compiler.php:82 { …}
    ./vendor/symfony/dependency-injection/ContainerBuilder.php:757 { …}
    ./vendor/symfony/http-kernel/Kernel.php:546 { …}
    ./vendor/shopware/core/Kernel.php:193 { …}
    ./vendor/symfony/framework-bundle/Console/Application.php:168 { …}
    ./vendor/symfony/framework-bundle/Console/Application.php:74 { …}
    ./vendor/symfony/console/Application.php:171 { …}
    ./bin/console:74 {
      › $application = new Application($kernel->getKernel());
      › $application->run($input);
      ›
      arguments: {
        $input: Symfony\Component\Console\Input\ArgvInput {#3 …}
      }
    }
  }
}

Then you maybe copied the classnames of your TaskHandler and/or Task with a \ prefix.

This is wrong:

<service id="\My\Module\ScheduledTask\UnpaidOrdersTask">
    <tag name="shopware.scheduled.task"/>
</service>
<service id="\My\Module\ScheduledTask\UnpaidOrdersTaskHandler">
    <argument type="service" id="scheduled_task.repository"/>
    <tag name="messenger.message_handler"/>
</service>

This is correct:

<service id="My\Module\ScheduledTask\UnpaidOrdersTask">
    <tag name="shopware.scheduled.task"/>
</service>
<service id="My\Module\ScheduledTask\UnpaidOrdersTaskHandler">
    <argument type="service" id="scheduled_task.repository"/>
    <tag name="messenger.message_handler"/>
</service>

The difference? The id:

My\Module\ScheduledTask\UnpaidOrdersTask
\My\Module\ScheduledTask\UnpaidOrdersTask

I hope this helps someone 🙂