Как я могу зарегистрировать свои сервисы и компоненты в Shopware 5?

#php #symfony #shopware

#php #symfony #shopware

Вопрос:

У меня проблема с регистрацией моих сервисов и компонентов в services.xml

Это то, что я получаю, когда пытаюсь зарегистрировать свой компонент.

PHP Фатальная ошибка: неперехваченный Symfony Component DependencyInjection Exception ServiceNotFoundException: служба «task.task_subscriber» зависит от несуществующей службы «task.service.random_product». в /var/www/shopware/vendor/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php:31 Трассировка nStack:n#0 /var/www/shopware/vendor/symfony/dependency-injection/Compiler/AbstractRecursivePass.php (60): SymfonyComponentDependencyInjectionCompilerCheckExceptionOnInvalidReferenceBehaviorPass->processValue(Object(SymfonyComponentDependencyInjectionReference), false) n #1 /var/www/shopware/vendor/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php(28) : SymfonyComponentDependencyInjectionCompilerAbstractRecursivePass->Значение процесса(массив, false)n#2 /var/www/shopware/vendor/symfony/dependency-injection/Compiler/AbstractRecursivePass.php (67): SymfonyComponentDependencyInjectionCompilerCheckExceptionOnInvalidReferenceBehaviorPass->processValue(Array)n# 3 /var в /var/www/shopware/vendor/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php в строке 31

Это мой services.xml

 <services>
    <service id="task.task_subscriber" class="TaskSubscriberTaskSubscriber">
        <argument>%task.plugin_name%</argument>
        <argument>%task.plugin_dir%</argument>
        <argument type="service" id="task.components.random_product" />
        <argument type="service" id="shopware.plugin.cached_config_reader" />
        <tag name="shopware.event_subscriber" />
    </service>

    <service id="task.random_product" class="TaskComponentsRandomProduct">
        <argument type="service" id="dbal_connection"/>
    </service>
</services>
  

Может кто-нибудь объяснить мне, пожалуйста, в чем проблема?

Комментарии:

1. task.components.random_product против task.random_product

2. Оба не работают

3. Что вы пытались отладить проблему? Кроме того, почему в определении сервиса отсутствует какое-либо упоминание task.service.random_product из данного сообщения об ошибке?

4. Вы регистрируете сервис с id task.random_product , но пытаетесь использовать его с task.components.random_product . Вам нужно использовать один и тот же идентификатор в обоих местах.

Ответ №1:

вы регистрируете свой класс randomProduct с id=»task.random_product»

поэтому вам нужно использовать тот же идентификатор в другом сервисе

так что это должно сработать

 <services>
    <service id="task.task_subscriber" class="TaskSubscriberTaskSubscriber">
        <argument>%task.plugin_name%</argument>
        <argument>%task.plugin_dir%</argument>
        <argument type="service" id="task.random_product" />
        <argument type="service" id="shopware.plugin.cached_config_reader" />
        <tag name="shopware.event_subscriber" />
    </service>

    <service id="task.random_product" class="TaskComponentsRandomProduct">
        <argument type="service" id="dbal_connection"/>
    </service>
</services>
  

и в вашем классе TaskSubscriber вы можете передать randomProduct в

__конструируйте в том же порядке, что и для аргументов, и используйте внедрение зависимостей в вашем коде

итак, это будет выглядеть так

 <?php

namespace TaskSubscriber;

use TaskComponentsRandomProduct;

class TaskSubscriber implements SubscriberInterface
{
    private $pluginName;
    private $pluginDirectory;
    private $randomProduct;
    private $config;

    public function __construct(
    $pluginName, 
    $pluginDirectory,
    RandomProduct $randomProduct,
    $config
    )
    {
        $this->pluginName = $pluginName;
        $this->pluginDirectory = $pluginDirectory;
        $this->randomProduct = $randomProduct;
        $this->config = $config;
    }