#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;
}