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