【发布时间】:2023-01-16 17:38:21
【问题描述】:
到目前为止,工作包现在需要在使用该包的项目中有自己的配置文件,以单独管理包设置。
但是,无论我使用哪种方法(Symfony 6.1 之前的旧方法或扩展AbstractBundle 的新方法),在项目./config/packages/ 目录中都不会创建任何新的.yaml-File。
这是我的代码(旧样式,在 Symfony 6.1 之前,扩展 Bundle):
捆绑类
mycorpforms/src/MyCorpFormsBundle.php
<?php
namespace MyCorp\FormsBundle;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\Definition\Configurator\DefinitionConfigurator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class MyCorpFormsBundle extends Bundle
{
// empty
}
配置
mycorpforms/src/DependencyInjection/Configuration.php
<?php
namespace MyCorp\FormsBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder('mycorp_forms');
$treeBuilder->getRootNode()
->children()
->booleanNode('favorite_submenu_enabled')->defaultFalse()->end()
->end()
;
return $treeBuilder;
}
}
延期
mycorpforms/src/DependencyInjection/MyCorpFormsExtension.php
<?php
namespace MyCorp\FormsBundle\DependencyInjection;
use Knp\Bundle\SnappyBundle\DependencyInjection\Configuration;
use Symfony\Component\Config\Definition\Processor;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
class MyCorpFormsExtension extends Extension
{
public function load(array $configs, ContainerBuilder $containerBuilder)
{
$loader = new YamlFileLoader(
$containerBuilder,
new FileLocator(__DIR__.'/../../config/packages')
);
$loader->load('mycorp_forms.yaml');
$configuration = new Configuration();
$processor = new Processor();
$config = $processor->processConfiguration($configuration, $configs);
$containerBuilder->setParameter('mycorp_forms.favorite_submenu_enabled', $config['favorite_submenu_enabled']);
}
}
山药
此外,我在包 ./config/packages/ 目录中添加了所需的 mycorp_forms.yaml。
这是项目中所需的实际文件:
mycorpforms/config/packages/mycorp_forms.yaml
mycorp_forms:
# Enable Favorite-Sub-Menu (Requires Knp-Snappy-Bundle !)
favorite_submenu_enabled: false
该捆绑包可以完美地安装在我的任何项目中,但是没有创建 mycorp_forms.yaml 文件。显然,这需要symfony/flex,这是迄今为止捆绑包本身所需要的。
问:我在这里想念什么?
问:如何在安装包时自动添加这个yaml-文件?我上下阅读文档无数次,但老实说,每次我都更加困惑。
非常感谢您的帮助或解释!
【问题讨论】:
-
yaml 配置文件不是由您的代码中的任何内容创建的。它是由一个食谱.为了创建额外的文件,您需要将您的项目添加到recipe repository
-
哦,现在这更有意义了。我明白了,这也可以用私有包来完成:symfony.com/doc/current/setup/flex_private_recipes.html。谢谢你指点我!
-
或者自己复制/粘贴文件,这是我们的祖先必须做的。令人困惑的是 config/bundles.php 将在没有进一步努力的情况下得到更新,但没有内置的方式来复制文件。
-
好吧,不。 $loader->load 用于服务文件,而不是配置。所以让那些线消失。该框架将自动加载 config/packages 中的所有文件,无论它们的名称如何。
mycorp_forms:部分下的任何内容都会传递给 $configs 变量中的MyBundle::load。处理器基本上将 $configs 数据与您的 Configuration 对象合并。所以,是的,让一些东西工作非常混乱。可能有助于查看一些现有的 Symfony 包。 -
这是一个使用 AbstractBundle 类的非常简单的工作示例。
标签: symfony bundle symfony-bundle