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

У меня есть проект 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.

Мой custom services.yml загружается через класс СотрудничествоExtension:

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

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector