#symfony #config
#symfony #конфигурация
Вопрос:
Демонстрационный код этой проблемы виден на: GitHub и Packagist, пожалуйста, обратитесь к версии 0.0.3.
Моя проблема: я хочу сгенерировать configpackages owner_test .файл yaml при запуске :
композитору требуется владелец / тестовый пакет: 0.0.3
Но Composer выдает ошибку :
Нет расширения, способного загружать конфигурацию для «owner_test» (в «C:UsersUSERPROJECTvendorownertest-bundleDependencyInjection/../Resources/configowner_test.yaml»). Искал пространство имен «owner_test», не нашел «none».
Корневой ключ и имя пакета исправлены, и я прочитал всю найденную документацию, но ничего не подходит :
- https://symfony.com/doc/4.4/bundles/configuration.html
- https://symfony.com/doc/4.4/bundles/extension.html
Спасибо за помощь
Комментарии:
1. Пакеты не имеют файла конфигурации. Вместо этого вы создаете объект конфигурации, который предоставляет вам информацию о конфигурации по умолчанию. owner_test. yaml входит в приложение и позволяет переопределять значения конфигурации.
2. Спасибо, но я пытаюсь, и ничего не работает. Можете ли вы показать мне пример очень простого пакета с переменными конфигурации в YAML. Я не могу найти ничего ясного на Github…
Ответ №1:
Вот рабочий пример: https://github.com/cerad/bundle4
Источник пакета находится в каталоге src-owner
Чего вам не хватает и, возможно, вы не до конца понимаете, так это класса конфигурации пакета:
namespace OwnerTestBundleDependencyInjection;
use SymfonyComponentConfigDefinitionBuilderTreeBuilder;
use SymfonyComponentConfigDefinitionConfigurationInterface;
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder('owner_test');
$treeBuilder->getRootNode()
->children()
->booleanNode('isDisplay')->defaultTrue()->end()
->booleanNode('someBoolean')->defaultTrue()->end()
->end()
;
return $treeBuilder;
}
}
Класс Configuration используется для настройки значений конфигурации по умолчанию для вашего пакета. Эти значения могут быть переопределены на уровне приложения через config/packages/owner_test.yaml. У вашего пакета не будет собственного файла конфигурации yaml. Вещи просто так не работают.
Затем ваше расширение становится:
namespace OwnerTestBundleDependencyInjection;
use SymfonyComponentDependencyInjectionContainerBuilder;
use SymfonyComponentDependencyInjectionExtensionExtension;
class OwnerTestExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
// Has what is in config/packages/owner_test.yaml
dump($configs);
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);
dump($config);
// At this point you would use $config to define your parameters or services
}
}
Изучите выходные данные дампа и прочитайте документы, пока не поймете, что происходит при обработке конфигурации. Просто используйте «bin / console cache: очистить». Я добавил второе значение конфигурации, чтобы сделать его немного проще для понимания. Вероятно, вы захотите добавить больше.
На этом этапе вам нужно добавить код для передачи ваших значений конфигурации в ContainerBuilder.
Ответ №2:
Хорошо, он запущен, большое спасибо 😉
Я не уверен, что это лучшая практика, можете ли вы поправить меня, если это необходимо?
Ваш код идеален, для создания теста я просто добавляю :
Тестовая конфигурационная переменная :
#configservices.yaml
parameters:
testParam: 42
Тестовая переменная env :
#.env
SECRET_TEST_KEY=abcde
Эта строка в вашем файле для отправки конфигурации пакета в приложение :
#src-ownerDependencyInjectionOwnerTestExtension.php
$container->setParameter('owner_test', $config);
Скрипт PHP (добавлен только для имитации построения реального скрипта) :
#src-ownerServicesOwnerTestService.php
<?php
namespace OwnerTestBundleServices;
class OwnerTestService
{
private $config;
public function __construct(array $config)
{
$this->config = $config;
}
public function getBundleConfig()
{
return $this->config['someBoolean'];
}
function getAppConfig()
{
return $this->config['testParam'];
}
}
Контроллер для запуска теста :
#srcControllerTestController.php
namespace AppController;
use OwnerTestBundleServicesOwnerTestService;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAnnotationRoute;
class TestController extends AbstractController
{
/**
* @Route("/")
*/
public function show()
{
$config = array_merge(['testParam' => $this->getParameter('testParam')], $this->getParameter('owner_test'));
$ownerTestService = new OwnerTestService($config);
return new Response(
'<html><body>BUNDLE CONFIG : ' . $ownerTestService->getBundleConfig() . ', APP CONFIG : ' . $ownerTestService->getAppConfig() . ', ENV : ' . $_ENV['SECRET_TEST_KEY'] . '</body></html>'
);
}
}
Результат идеальный, я могу использовать всю свою конфигурацию (и env) в комплекте 🙂