Symfony 4: служба отображается как частная при загрузке из дополнительных служб yaml при пометке как общедоступная - PullRequest
0 голосов
/ 10 января 2019

У меня есть проект Symfony 4.

А вот и сервис. Он помечен как публичный и находится в отдельном сотрудничестве.yml, которое связано с проектом:

services:
    App\Matcher\CooperationSiteConfigMatcher:
        public: true

Вот сам класс

<?php

namespace App\Matcher;

use App\Factory\CooperationOptionsFactory;
use App\Options\Cooperation\CooperationOptions;
use App\Resolver\SiteResolver;
use App\Factory\Exception\MissingCooperationOptionsException;
use Assert\AssertionFailedException;

class CooperationSiteConfigMatcher
{
    const TYPE_PARTNERSHIP = 'partnership';
    const TYPE_FRANCHISE   = 'franchise';
    /**
     * @var CooperationOptionsFactory
     */
    private $optionsFactory;
    /**
     * @var SiteResolver
     */
    private $siteResolver;

    /**
     * CooperationSiteConfigMatcher constructor.
     * @param CooperationOptionsFactory $optionsFactory
     * @param SiteResolver $siteResolver
     */
    public function __construct(CooperationOptionsFactory $optionsFactory, SiteResolver $siteResolver)
    {
        $this->optionsFactory = $optionsFactory;
        $this->siteResolver = $siteResolver;
    }

    /**
     * @param $group
     * @return CooperationOptions
     * @throws AssertionFailedException
     * @throws MissingCooperationOptionsException
     */
    public function matchOptionsByGroupAndSite($group)
    {
        $domainAliasKey = $this->siteResolver->resolve();

        return $this->optionsFactory->createForSite($group, $domainAliasKey);
    }
}

Глобальная базовая конфигурация service.yml:

 services:
        # default configuration for services in *this* file
        _defaults:
            autowire: true      # Automatically injects dependencies in your services.
            autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
            public: false       # Allows optimizing the container by removing unused services; this also means
                                # fetching services directly from the container via $container->get() won't work.
                                # The best practice is to be explicit about your dependencies anyway.
    App\:
        resource: '%kernel.root_dir%/*'
        exclude: '%kernel.root_dir%/{Entity,Migrations,Tests,Kernel.php,Form/EventListener,Request}'

Но я получаю сообщение об ошибке:

Служба или псевдоним App \ Matcher \perationSiteConfigMatcher имеет был удален или встроен, когда контейнер был скомпилирован. Вам следует либо сделайте его публичным, либо прекратите использование контейнера напрямую и используйте вместо этого внедрение зависимости.

Проблема исчезает, когда я перемещаю этот сервис в глобальные services.yml.

Мой пользовательский файл services.yml загружается с помощью классаperationExtension:

class CooperationExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $config = $this->processConfiguration(new CooperationConfiguration(), $configs);

        $loader = new YamlFileLoader(
            $container,
            new FileLocator(__DIR__ . '/../Resources/config/services')
        );
        $loader->load('cooperation.yaml');

        $this->generateCooperationServices($config, $container);
    }

    public function getAlias()
    {
        return 'cooperation';
    }

    public function getXsdValidationBasePath()
    {
        return false;
    }

    public function getNamespace()
    {
        return "cooperation/schema";
    }
}

Расширение зарегистрировано в Kernel.php метод configureContainer:

 protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void
    {
        $cooperationExtension = new CooperationExtension();
        $container->registerExtension($cooperationExtension);
        $container->loadFromExtension($cooperationExtension->getAlias());

        $container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php'));
        // Feel free to remove the "container.autowiring.strict_mode" parameter
        // if you are using symfony/dependency-injection 4.0+ as it's the default behavior
        $container->setParameter('container.autowiring.strict_mode', true);
        $container->setParameter('container.dumper.inline_class_loader', true);
        $confDir = $this->getProjectDir().'/config';

        $loader->load($confDir.'/{packages}/*'.self::CONFIG_EXTS, 'glob');
        $loader->load($confDir.'/{packages}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, 'glob');
        $loader->load($confDir.'/{services}'.self::CONFIG_EXTS, 'glob');
        $loader->load($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS, 'glob');
    }

Symfony видит сотрудничество. Я проверил это, когда удалил некоторые другие службы из него, и возникло исключение.

Но почему-то он не сливается правильно с глобальными services.yml, и я не вижу этот сервис общедоступным, когда загружаю его из partnership.yml

...