OptionsResolver组件

编辑本页

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

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

OptionsResolver组件

OptionsResolver组件帮助您使用选项数组配置对象。它支持默认值、选项约束和惰性选项。

安装

你可以用两种不同的方式安装组件:

使用

想象一下你有一个梅勒类,有2个选项:宿主而且密码.这些选项将由OptionsResolver组件处理。

首先,创建梅勒类:

1 2 3 4 5 6 7 8
梅勒受保护的选项公共函数__construct(数组选项=数组(){}}

你当然可以设置选择美元值直接在属性上。相反,使用OptionsResolver类,并让它通过调用解决().随着你的继续,这样做的好处会越来越明显:

1 2 3 4 5 6 7 8 9
使用欧宝娱乐app下载地址\组件\OptionsResolver\OptionsResolver/ /……公共函数__construct(数组选项=数组()解析器OptionsResolver ();->选择=解析器->解决(选项);}

options属性现在是一个定义良好的数组,所有已解析的选项都可用:

1 2 3 4 5 6 7 8 9
/ /……公共函数sendMail邮件=……;邮件->setHost (->选项(“主机”]);邮件->setUsername (->选项(“用户名”]);邮件->向setPassword (->选项(“密码”]);/ /……

配置OptionsResolver

现在,试着实际使用这个类:

1 2 3 4 5
梅勒梅勒(数组“主机”= >“smtp.example.org”“用户名”= >“用户”“密码”= >“爸爸$ $词”));

现在,你会收到一个InvalidOptionsException,它告诉你选项宿主而且密码不存在。这是因为您需要配置OptionsResolver首先,这样它就知道应该解决哪些选项。

提示

要检查是否存在某个选项,可以使用称为()函数。

一个最佳实践是将配置放在一个方法中(例如。configureOptions).可以在构造函数中调用此方法来配置OptionsResolver类:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
使用欧宝娱乐app下载地址\组件\OptionsResolver\OptionsResolver使用欧宝娱乐app下载地址\组件\OptionsResolver\OptionsResolverInterface梅勒受保护的选项公共函数__construct(数组选项=数组()解析器OptionsResolver ();->configureOptions (解析器);->选择=解析器->解决(选项);}受保护的函数configureOptions(OptionsResolverInterface解析器/ /……配置解析器,您将了解到这一点//在下面的部分}}

设置默认值

大多数选项都有默认值。您可以通过调用来配置这些选项setDefaults ()

1 2 3 4 5 6 7 8 9
/ /……受保护的函数setDefaultOptions(OptionsResolverInterface解析器/ /……解析器->setDefaults (数组“用户名”= >“根”));}

这将增加一个选项-用户名-并给它一个默认值.如果用户传入一个用户名选项,该值将覆盖此默认值。您不需要配置用户名作为一个可选选项。

需要选择

宿主选项是必需的:类没有它就不能工作。您可以通过呼叫设置所需的选项setRequired ()

1 2 3 4 5
/ /……受保护的函数setDefaultOptions(OptionsResolverInterface解析器解析器->setRequired (数组“主机”));}

你现在可以正常使用这个类了:

1 2 3 4 5
梅勒梅勒(数组“主机”= >“smtp.example.org”));回声梅勒->getHost ();/ / ' smtp.example.org '

如果您没有通过必填项,则aMissingOptionsException会被扔。

提示

要确定是否需要某个选项,可以使用isRequired ()方法。

可选选项

有时,选项可以是可选的(例如密码选项中的梅勒类),但它没有默认值。您可以通过调用来配置这些选项setOptional ()

1 2 3 4 5 6 7
/ /……受保护的函数setDefaultOptions(OptionsResolverInterface解析器/ /……解析器->setOptional (数组“密码”));}

带有默认值的选项已经被标记为可选。

提示

当将一个选项设置为可选时,你不能确定它是否在数组中。在使用该选项之前,必须检查该选项是否存在。

为了避免每次都检查它是否存在,您还可以设置默认值为选项的setDefaults ()方法(参见设置默认值),这意味着该元素始终存在于数组中,但默认值为

依赖于其他选项的默认值

假设你添加一个港口选项。梅勒类,其默认值由您根据加密来猜测。你可以通过使用一个闭包作为默认值来轻松做到这一点:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用欧宝娱乐app下载地址\组件\OptionsResolver\选项使用欧宝娱乐app下载地址\组件\OptionsResolver\OptionsResolverInterface/ /……受保护的函数setDefaultOptions(OptionsResolverInterface解析器/ /……解析器->setDefaults (数组“加密”= >“端口”= >函数(选项选项如果“ssl”= = =选项“加密”) {返回465;}返回25;}));}

选项类实现ArrayAccess迭代器而且可数名词.这意味着您可以像处理包含选项的普通数组一样处理它。

谨慎

闭包的第一个参数必须为类型,提示为选项,否则视为值。

覆盖默认值

以前设置的默认值可以通过调用来覆盖setDefaults ()一次。当使用闭包作为新值时,会传递2个参数:

  • 选择美元:一个选项实例使用所有其他默认选项
  • previousValue美元:之前设置的默认值
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
使用欧宝娱乐app下载地址\组件\OptionsResolver\选项使用欧宝娱乐app下载地址\组件\OptionsResolver\OptionsResolverInterface/ /……受保护的函数setDefaultOptions(OptionsResolverInterface解析器/ /……解析器->setDefaults (数组“加密”= >“ssl”“主机”= >“localhost”));/ /……解析器->setDefaults (数组“加密”= >tls的//简单覆盖“主机”= >函数(选项选项previousValue返回“localhost”= =previousValue?“127.0.0.1”previousValue;}));}

提示

如果前面的默认值是由昂贵的闭包计算的,并且您不需要访问它,则可以使用replaceDefaults ()方法相反。它就像setDefaults但只是擦除前一个值以提高性能。这意味着当用另一个闭包重写时,之前的默认值不可用:

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
使用欧宝娱乐app下载地址\组件\OptionsResolver\选项使用欧宝娱乐app下载地址\组件\OptionsResolver\OptionsResolverInterface/ /……受保护的函数setDefaultOptions(OptionsResolverInterface解析器/ /……解析器->setDefaults (数组“加密”= >“ssl”“重”= >函数(选项选项//一些繁重的计算来创建$result返回结果;}));解析器->replaceDefaults (数组“加密”= >tls的//简单覆盖“重”= >函数(选项选项// $previousValue不存在/ /……返回someOtherResult;}));}

请注意

覆盖时未提及的现有选项键将被保留。

配置允许值

并非所有值都是选项的有效值。假设梅勒类有一个运输选项,它只能是其中之一sendmail邮件smtp.您可以通过调用setAllowedValues ()

1 2 3 4 5 6 7 8 9
/ /……受保护的函数setDefaultOptions(OptionsResolverInterface解析器/ /……解析器->setAllowedValues (数组“加密”= >数组“ssl”tls的)));}

还有一个addAllowedValues ()方法,如果要将允许值添加到先前配置的允许值中,可以使用该方法。

配置允许类型

您还可以指定允许的类型。例如,港口Option可以是任何东西,但必须是整数。可以通过调用来配置这些类型setAllowedTypes ()

1 2 3 4 5 6 7 8 9
/ /……受保护的函数setDefaultOptions(OptionsResolverInterface解析器/ /……解析器->setAllowedTypes (数组“端口”= >“整数”));}

类型关联的可能类型is_ *PHP函数或类名。您还可以传递一个类型数组作为值。例如,阵列(“空”、“字符串”)允许港口或者一个字符串

还有一个addAllowedTypes ()方法,可以使用该方法将允许类型添加到前面的允许类型中。

标准化选项

有些值在使用之前需要规范化。例如,假设宿主应该总是以http://.为此,您可以编写规范化程序。这些闭包将在传递所有选项后执行,并应返回规范化的值。您可以通过调用setNormalizers ()

12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ /……受保护的函数setDefaultOptions(OptionsResolverInterface解析器/ /……解析器->setNormalizers (数组“主机”= >函数(选项选项价值如果“http://”! = = substr (价值07)) {价值“http://”价值;}返回价值;}));}

可以看到闭包也有选择美元参数。有时候,你需要使用其他选项来规范化:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ /……受保护的函数setDefaultOptions(OptionsResolverInterface解析器/ /……解析器->setNormalizers (数组“主机”= >函数(选项选项价值如果(!in_array (substr (价值07),数组“http://”“https://”))) {如果选项“ssl”) {价值“https://”价值;}其他的价值“http://”价值;}}返回价值;}));}
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。