如何创建一个包的友好配置

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.3,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

如何创建一个包的友好配置

如果打开主应用程序配置目录(通常配置/包/),您将看到许多不同的文件,例如framework.yamltwig.yaml而且doctrine.yaml.其中每一个都配置一个特定的包,允许您在高层次上定义选项,然后让包根据您的设置进行所有低级的复杂更改。

例如,下面的配置告诉FrameworkBundle启用表单集成,这涉及到相当多服务的定义以及其他相关组件的集成:

  • YAML
  • XML
  • PHP
1 2
框架:形式:真正的

使用Bundle扩展

假设您正在创建一个新的捆绑包—AcmeSocialBundle—它提供了与Twitter的集成。为了让你的bundle对用户来说是可配置的,你可以添加一些这样的配置:

  • YAML
  • XML
  • PHP
1 2 3 4 5
#配置/包/ acme_social.yamlacme_social:twitter:client_id:123client_secret:your_secret

其基本思想是,不让用户重写单个参数,而是让用户配置几个专门创建的选项。作为包开发人员,然后解析该配置并在“Extension”类中加载正确的服务和参数。

请注意

bundle配置的根键(acme_social在前面的例子中)是由您的包名自动确定的(它是蛇的情况的包名称后缀)。

另请参阅

阅读更多关于扩展在如何在一个包内加载服务配置

提示

如果一个bundle提供了一个Extension类,那么您应该这样做通常重写该bundle中的任何服务容器参数。其思想是,如果存在一个Extension类,那么每个应该可配置的设置都应该出现在该类提供的配置中。换句话说,扩展类定义了所有将维护向后兼容性的公共配置设置。

另请参阅

有关依赖注入容器内的参数处理,请参阅在依赖注入类中使用参数

处理美元配置数组

首先,您必须创建一个扩展类,如上所述如何在一个包内加载服务配置

类的时候acme_socialkey(这是DI别名)中的配置文件,它下面的配置被添加到配置数组中并传递给load ()方法(Symfony自动将XML和YAML转换为数组欧宝娱乐app下载地址)。

对于上一节中的配置示例,传递给您的数组load ()方法看起来像这样:

1 2 3 4 5 6 7 8
[[“推特”= > [“client_id”= >123“client_secret”= >“your_secret”,],],]

注意这是一个数组的数组,而不仅仅是配置值的单个平面数组。这是有意为之,因为它允许Symfony解析多个配置资源。欧宝娱乐app下载地址例如,如果acme_social出现在另一个配置文件中配置/包/ dev / acme_social.yaml-在它下面有不同的值,传入的数组可能看起来像这样:

12 3 4 5 6 7 8 9 10 11 12 13 14 15
// config/packages/acme_social.yaml中的值“推特”= > [“client_id”= >123“client_secret”= >“your_secret”,],],// config/packages/dev/acme_social.yaml中的值“推特”= > [“client_id”= >456,],],]

两个数组的顺序取决于先设置哪个数组。

不过别担心!欧宝娱乐app下载地址Symfony的Config组件将帮助您合并这些值,提供默认值,并在错误配置时向用户提示验证错误。下面是它的工作原理。创建一个配置DependencyInjection目录,并构建一个定义bundle配置结构的树。

配置类来处理示例配置,如下所示:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/ / src / Acme / SocialBundle / DependencyInjection /配置。configuration名称空间AcmeSocialBundleDependencyInjection使用欧宝娱乐app下载地址组件配置定义构建器TreeBuilder使用欧宝娱乐app下载地址组件配置定义ConfigurationInterface配置实现了ConfigurationInterface公共函数getConfigTreeBuilder()treeBuilderTreeBuilder (“acme_social”);treeBuilder->getRootNode ()->孩子()->arrayNode (“推特”->孩子()->integerNode (“client_id”->结束()->scalarNode (“client_secret”->结束()->结束()->结束()/ /微博->结束();返回treeBuilder;}}

另请参阅

配置类可以比这里显示的复杂得多,它支持“原型”节点、高级验证、特定于xml的规范化和高级合并。你可以在Config组件文档欧宝体育电话.类中的核心Configuration类,例如FrameworkBundle配置或者是TwigBundle配置

这个类现在可以用于您的load ()方法来合并配置和强制验证(例如,如果传递了一个额外的选项,将抛出一个异常):

1 2 3 4 5 6 7 8 9 10
/ / src / Acme / SocialBundle / DependencyInjection / AcmeSocialExtension.php公共函数负载(数组配置, ContainerBuilder容器配置配置();配置->processConfiguration (配置配置);//你现在有这2个配置键// $config['twitter']['client_id']和$config['twitter']['client_secret']

processConfiguration ()方法中定义的配置树配置类来验证、规范化和合并所有配置数组。

现在,你可以使用美元配置变量修改您的包提供的服务。例如,假设你的bundle有以下配置示例:

12 3 4 5 6 7 8 9 10 11 12 13 14
<!——src/Acme/SocialBundle/Resources/config/services.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<容器xmlns“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id“acme.social.twitter_client”“Acme \ SocialBundle \ TwitterClient”><论点>论点><!——将用client_id动态填充——><论点>论点><!——将用client_secret动态填充——>服务>服务>容器>

在你的扩展中,你可以加载它并动态设置它的参数:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src / Acme / SocialBundle / DependencyInjection / AcmeSocialExtension.php/ /……使用欧宝娱乐app下载地址组件配置FileLocator使用欧宝娱乐app下载地址组件DependencyInjection加载程序XmlFileLoader公共函数负载(数组配置, ContainerBuilder容器加载程序XmlFileLoader (容器FileLocator(目录名(__DIR__).“/资源/配置”));加载程序->负载(“xml”);配置配置();配置->processConfiguration (配置配置);定义容器->getDefinition (“acme.social.twitter_client”);定义->replaceArgument (0配置“推特”] [“client_id”]);定义->replaceArgument (1配置“推特”] [“client_secret”]);}

提示

而不是打电话processConfiguration ()在扩展中每次提供一些配置选项时,您可能希望使用ConfigurableExtension自动为你做这个:

12 3 4 5 6 7 8 9 10 11 12 13 14
/ / src / Acme / HelloBundle / DependencyInjection / AcmeHelloExtension.php名称空间AcmeHelloBundleDependencyInjection使用欧宝娱乐app下载地址组件DependencyInjectionContainerBuilder使用欧宝娱乐app下载地址组件HttpKernelDependencyInjectionConfigurableExtensionAcmeHelloExtension扩展ConfigurableExtension//注意这个方法被称为loadInternal而不是load受保护的函数loadInternal(数组mergedConfig, ContainerBuilder容器/ /……}}

这个类使用getConfiguration ()方法获取Configuration实例。

使用Config组件是完全可选的。的load ()方法获取配置值数组。相反,您可以自己解析这些数组(例如,通过重写配置和使用收取检查值的存在)。注意,它很难支持XML:

1 2 3 4 5 6 7 8 9 10
公共函数负载(数组配置, ContainerBuilder容器配置= [];//让资源覆盖之前设置的值foreach配置作为subConfig){配置= array_merge (配置subConfig);}/ /……现在使用平面$config数组

修改另一个Bundle的配置

如果您有多个相互依赖的捆绑包,允许其中一个可能会很有用扩展类来修改传递给另一个bundle的配置扩展类。这可以通过使用prepend扩展来实现。详情请参见如何简化多个bundle的配置

转储配置

配置:dump-reference命令使用Yaml格式将bundle的默认配置转储到控制台中。

只要你的包的配置位于标准位置(YourBundle \ DependencyInjection \配置)并且没有构造函数,它将自动工作。如果你有不同的东西,你的扩展类必须重写扩展::getConfiguration ()方法的实例配置

支持XML

欧宝娱乐app下载地址Symfony允许人们以三种不同的格式提供配置:Yaml、XML和PHP。Yaml和PHP都使用相同的语法,并且在使用Config组件时默认受到支持。支持XML需要您做更多的事情。但在与他人共享您的包时,建议您遵循以下步骤。

让您的配置树为XML做好准备

Config组件默认提供了一些方法,以允许它正确地处理XML配置。看到“定义和处理配置值组件文档。欧宝体育电话但是,你也可以做一些可选的事情,这将改善使用XML配置的体验:

选择XML命名空间

在XML中,XML名称空间用于确定哪些元素属于特定包的配置。方法返回名称空间扩展::getNamespace ()方法。按照约定,名称空间是一个URL(它不必是有效的URL,也不需要存在)。默认情况下,包的命名空间为http://example.org/schema/dic/DI_ALIAS,在那里DI_ALIAS是扩展的DI别名。你可能想把它改成一个更专业的URL:

12 3 4 5 6 7 8 9 10 11 12
/ / src / Acme / HelloBundle / DependencyInjection / AcmeHelloExtension.php/ /……AcmeHelloExtension扩展扩展/ /……公共函数getNamespace()返回“http://acme_company.com/schema/dic/hello”;}}

提供XML模式

XML有一个非常有用的特性叫做XML模式.这允许您在XML模式定义(XSD文件)中描述所有可能的元素和属性及其值。ide使用这个XSD文件进行自动补全,Config组件使用它来验证元素。

为了使用模式,XML配置文件必须提供一个xsi: schemaLocation属性指向某个XML名称空间的XSD文件。这个位置总是以XML名称空间开始。然后将此XML名称空间替换为返回的XSD验证基本路径扩展::getXsdValidationBasePath ()方法。然后,这个名称空间后面跟着从基本路径到文件本身的其余路径。

按照惯例,XSD文件位于资源/ config /模式/,但你可以把它放在任何你喜欢的地方。你应该返回这个路径作为基路径:

12 3 4 5 6 7 8 9 10 11 12
/ / src / Acme / HelloBundle / DependencyInjection / AcmeHelloExtension.php/ /……AcmeHelloExtension扩展扩展/ /……公共函数getXsdValidationBasePath()返回__DIR__“/ . . /资源/ config /模式”;}}

假设调用了XSD文件hello-1.0.xsd,则模式位置为https://acme_company.com/schema/dic/hello/hello-1.0.xsd

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
<!——config/packages/acme_hello.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<容器xmlns“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi“http://www.w3.org/2001/XMLSchema-instance”xmlns: acme-hello“http://acme_company.com/schema/dic/hello”xsi: schemaLocation“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd http://acme_company.com/schema/dic/hello https://acme_company.com/schema/dic/hello/hello-1.0.xsd”><acme-hello:配置><!——……-->acme-hello:配置><!——……-->容器>
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
欧宝娱乐app下载地址Symfony 5.3支持通过JoliCode