386просмотров
4 июня 2024 г.
Score: 425
В Symfony и Laravel любят настраивать различные компоненты с помощью YAML, ассоциативных массивов, XML. Когда YAML появился в моей жизни, я думал капец, как это круто! Стильно, модно, молодежно. Но ничего подобного. Радует, что “doctrine” отказались от YAML. Проблема всех этих форматов для конфигов в том, что они требуют доп валидации и проверок. Стат анализ ловит не всё, либо вообще ничего, а чтобы в IDE можно было прослеживать зависимости, если указываем классы, нужен либо плагин под фреймворк, ещё возможно и платный. Если это конфиг в виде yaml или ассоциативный массив, без доки не понять какой формат, какие типы данных передавать, какие обязательные, какие нет и т.д. Такие штуки no friendly dev. Я сейчас повсеместно внедряю конфигурации через объекты. Например, Doctrine Symfony Bundle в конфигурации с YAML выглядит так: doctrine: dbal: dbname: '%env(resolve:APP_DATABASE_NAME)%' host: '%env(resolve:APP_DATABASE_HOST)%' port: '%env(resolve:APP_DATABASE_PORT)%' user: '%env(resolve:APP_DATABASE_USER)%' password: '%env(resolve:APP_DATABASE_SECRET)%' logging: false types: custom: Acme\HelloBundle\MyCustomType С конфигурацией через объекты этот же конфиг будет выглядеть так: <?php declare(strict_types=1); return new DoctrineConfig( dbal: new DbalConfig( dbname: getenv('APP_DATABASE_NAME'), host: getenv('APP_DATABASE_HOST'), port: getenv('APP_DATABASE_PORT'), user: getenv('APP_DATABASE_USER'), password: getenv('APP_DATABASE_SECRET'), logging: false, types: [ new CustomType('custom', Acme\HelloBundle\MyCustomType::class), ] )
); Что это дает: - не нужна валидация, описание схем, XML и т.д. ;
- есть пред глазами состав полей;
- есть перед глазами типы полей;
- есть ссылки на реальные классы, можно использовать быструю навигацию. В случае рефакторинга, можно увидеть где явно используется класс, можно воспользоваться функционалом Refactoring в PHPStorm, чтобы переименовать класс, или просто перенести его в другой namespace, все автоматически исправится в конфиге, не нужно потом в ручную выискивать. По последней причине рекомендуется использовать именно способ PHP для конфигурация DI-контейнера. У Symfony три способа на выбор. В Laravel и либа PHP-DI только PHP конфигурация. Понятное дело, что если использовать готовые адаптеры для пакетов или бандлы, то не везде возможно сконфигурировать предложенным способом. Но там где это возможно, отдаю приоритет в пользу конфигурации через объекты. Это делает процесс конфигурации и сопровождения кода намного приятней 🙂