У меня есть пакет, который мне нравится, например, для ввода в контроллер.Единственное, что я хочу от пользователя - это зарегистрировать пакет.И тогда вы можете свободно вводить службу в любом месте:
namespace App\Bundles;
class MyService
{
private $config;
public function __construct(array $options)
{
$this->config= $options;
}
public function hello()
{
echo "Hello world";
}
}
Я попытался определить эту строку в config / services.yaml:
App\Bundles\MyService: '@bundle_service'
Кажется, это работает,но я не хочу, чтобы пользователи делали это.
Это мой класс конфигурации:
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder("my_bundle");
$treeBuilder->getRootNode()
->children()
->arrayNode('author')
->children()
->scalarNode("name")->end()
->end()
->end()
->end();
return $treeBuilder;
}
}
И файл конфигурации my_bundle, который пока что является тестом:
my_bundle:
author:
name: "Name"
Класс расширения My Bundle:
class MyBundleExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
$loader = new YamlFileLoader(
new FileLocator(__DIR__ .'/../Resources/config')
);
$loader->load('services.yaml');
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);
$container->setDefinition('bundle_service', new Definition(MyService::class, [$config]));
$container->setAlias(MyService::class, 'bundle_service');
}
}
Мой класс связок:
class MyBundle extends Bundle
{
public function getContainerExtension()
{
return new MyBundleExtension();
}
}
Чего мне не хватает?Все работает, за исключением того, что я должен определить эту строку App\Bundles\MyService: '@bundle_service'
в config/services.yaml
, что я не хочу, чтобы мои пользователи делали.В MyBundleExtension я предоставил правильное определение:
$container->setDefinition('bundle_service', new Definition(MyService::class, [$config]));
$container->setAlias(MyService::class, 'bundle_service');
Когда я пропускаю код config/services.yaml
, я получаю эту ошибку:
Cannot autowire service "App\Bundles\MyService": argument "$options" of method "__construct()"