Создание пакета Symfony4 — невозможно сгенерировать файл конфигурации

#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».

Корневой ключ и имя пакета исправлены, и я прочитал всю найденную документацию, но ничего не подходит :

Спасибо за помощь

Комментарии:

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) в комплекте 🙂