See the configureContainer() method of the Kernel class to learn everything about the loading order of configuration files.
$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}/**/*'.self::CONFIG_EXTS, 'glob'); // <- добавил эту строку
$loader->load($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS, 'glob');
services
. Т.о. в главном services,yaml
у меня лежит описание автовайринга, а в директории уже конкретные реализации, которые автовайрингом не сделать. Иначе services,yaml
получается слишком большим App\Email\MyServiceDependencyRegistry
лучше использовать встроенный сервис-локатор: https://symfony.com/blog/new-in-symfony-3-3-servic...MyServiceDependencyRegistry
$loader->load('services.yaml');
if ($container->getParameter('kernel.environment') === 'test') {
$container->setAlias(DependencyInterface::class, FakeDependency::class);
}
Ну и собственно я это решил созданием прямо в папке тестов, где это все требуется, фейковых классов, по классу на файл. Выглядит, как по мне, чуть эстетичнее, чем писать его прямо в коде, да и переиспользовать можно.
Только подскажите, он отличается чем-либо от того ответа, в ветке которого мы общаемся?
$instance = new class ($this->createMock(YourInterface::class)) extends \Exception implements YourInterface {
private $mock;
public function __construct(YourInterface $mock, $message = "", $code = 0, Throwable $previous = null) {
parent::__construct($message, $code, $previous);
$this->mock = $mock;
}
public function interfaceMethod($parameter)
{
return $this->mock->interfaceMethod($parameter);
}
};