OptionsResolver组件
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.4,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
OptionsResolver组件
OptionsResolver组件帮助您使用选项数组配置对象。它支持默认值、选项约束和惰性选项。
安装
你可以用两种不同的方式安装组件:
- 通过Composer安装(
欧宝娱乐app下载地址symfony / options-resolver
在Packagist); - 使用官方Git存储库(https://github.com/欧宝娱乐app下载地址symfony/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 ($价值,0,7)) {$价值=“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 ($价值,0,7),数组(“http://”,“https://”))) {如果($选项[“ssl”) {$价值=“https://”.$价值;}其他的{$价值=“http://”.$价值;}}返回$价值;}));}