«Служба ххх зависит от несуществующей службы», которая кажется неверной? - PullRequest
0 голосов
/ 03 июля 2018

У меня есть приложение, которое я перевожу на Symfony 4.1. После включения container.autowiring.strict_mode: true я получил ошибку при настройке нашего пользовательского Router

The service ".service_locator.G69Xsbl.Foo\Bundle\Admin\SiteRoutingBundle\Routing\AdminSiteRouter" 
has a dependency on a non-existent service "Symfony\Component\Config\Loader\LoaderInterface".

Класс выглядит так:

<?php

namespace Foo\Bundle\Admin\SiteRoutingBundle\Routing;

use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Foo\Bundle\Common\CoreBundle\Manager\SiteManagerInterface;

class AdminSiteRouter extends Router
{
    const USE_SITE_HOST  = true;
    const USE_SITE_PARAM = false;

    protected $siteManager;

    public function setSiteManager(SiteManagerInterface $siteManager)
    {
        $this->siteManager = $siteManager;
    }

    public function generate($name, $parameters = [], $referenceType = self::ABSOLUTE_URL)
    {
        // some code
    }
}

Ни в этом классе, ни в расширенном классе Router из FrameworkBundle нет зависимости от LoaderInterface.

Конфигурация автоматического подключения для этого класса:

Foo\Bundle\Admin\SiteRoutingBundle\Routing\AdminSiteRouter:
    arguments:
        $resource: '%site_routing_file_path%'
        $options: []
    calls:
        - [setSiteManager, ['@Foo\Bundle\Common\CoreBundle\Manager\SiteManagerInterface']]

1 Ответ

0 голосов
/ 03 июля 2018

Похоже, что наличие двух аргументов контейнера вызывает проблему. При новой установке 4.1.1 я получил ту же ошибку. Исправлено с помощью:

# services.yaml
App\Service\AdminRouter:
    arguments:
        $container: '@service_container'
        $parameters: '@service_container'
        $resource: 'resource'
        $options: []

Мой админ-роутер был просто:

namespace App\Service;
use Symfony\Bundle\FrameworkBundle\Routing\Router;
class AdminRouter extends Router
{
}

Для справки, фреймворк-фреймворк выглядит так:

public function __construct(
    ContainerInterface $container, 
    $resource, 
    array $options = array(), 
    RequestContext $context = null, 
    ContainerInterface $parameters = null, 
    LoggerInterface $logger = null)
{

Обратите внимание на два аргумента ContainerInterface. Я думаю, что это запутывает autowire. Может быть даже ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...