OptionsResolver组件
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.3,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
OptionsResolver组件
OptionsResolver组件可以帮助您配置对象的选项数组。它支持默认值,约束和懒惰的选项。
安装
您可以安装组件在两个不同的方面:
- 安装它通过作曲家(
ob娱乐下载symfony / options-resolver
在Packagist); - 使用官方的Git存储库(https://github.com/ob娱乐下载symfony/options-resolver)。
然后,需要供应商/ autoload.php
文件,使作曲家提供的半自动的机制。否则,您的应用程序无法找到这个Symfony组件的类。ob娱乐下载
使用
想象你有一个梅勒
类,有2个选项:主机
和密码
。这些选项将由OptionsResolver组件。
首先,创建一个梅勒
类:
1 2 3 4 5 6 7 8
类梅勒{受保护的美元选项;公共函数__construct(数组美元选项=数组()){}}
当然你可以设置选择美元
直接在属性值。相反,使用OptionsResolver通过调用类,并让它解决选项解决()。这样做的优势将更加明显,你继续:
1 2 3 4 5 6 7 8 9
使用ob娱乐下载\组件\OptionsResolver\OptionsResolver;/ /……公共函数__construct(数组美元选项=数组()){美元解析器=新OptionsResolver ();美元这- >选择=美元解析器- >解决(美元选项);}
现在的选择属性是一个良好定义的数组所有解决选项可用:
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
类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
使用ob娱乐下载\组件\OptionsResolver\OptionsResolver;使用ob娱乐下载\组件\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 '
如果你不通过需要选择,MissingOptionsException将抛出。
提示
可以确定一个选项是必需的,你可以使用isRequired ()方法。
可选选项
有时,一个选项可以是可选的(例如密码
选项梅勒
类),但没有一个默认值。这些选项可以配置通过调用setOptional ():
1 2 3 4 5 6 7
/ /……受保护的函数setDefaultOptions(OptionsResolverInterface美元解析器){/ /……美元解析器- >setOptional (数组(“密码”));}
选择与违约已经标记为可选的。
提示
当设置一个选项为可选,你不能确定它是否在数组。你在使用前必须检查是否存在选择。
为了避免每次检查如果它存在,你也可以设置一个默认的零
一个选择使用setDefaults ()
方法(参见设置默认值),这意味着数组中的元素总是存在,但有一个默认的零
。
依赖于另一个选项的默认值
假设您添加一个港口
可以选择的梅勒
类的默认值基于加密。你猜您可以轻松地通过使用一个闭包作为默认值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用ob娱乐下载\组件\OptionsResolver\选项;使用ob娱乐下载\组件\OptionsResolver\OptionsResolverInterface;/ /……受保护的函数setDefaultOptions(OptionsResolverInterface美元解析器){/ /……美元解析器- >setDefaults (数组(“加密”= >零,“端口”= >函数(选项美元选项){如果(“ssl”= = =美元选项(“加密”){返回465年;}返回25;}));}
的选项类实现ArrayAccess,迭代器和可数名词。这意味着你可以处理它就像一个正常的数组包含选项。
谨慎
第一个参数必须typehinted关闭选项
,否则被认为是值。
覆盖默认值
之前设置的默认值可以通过调用被覆盖setDefaults ()一次。当使用一个闭包作为新值传递两个参数:
选择美元
:一个选项实例与其他所有默认选项previousValue美元
:前面的设置默认值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
使用ob娱乐下载\组件\OptionsResolver\选项;使用ob娱乐下载\组件\OptionsResolver\OptionsResolverInterface;/ /……受保护的函数setDefaultOptions(OptionsResolverInterface美元解析器){/ /……美元解析器- >setDefaults (数组(“加密”= >“ssl”,“主机”= >“localhost”));/ /……美元解析器- >setDefaults (数组(“加密”= >tls的,/ /简单的覆盖“主机”= >函数(选项美元选项,美元previousValue){返回“localhost”= =美元previousValue吗?“127.0.0.1”:美元previousValue;}));}
提示
如果前面的默认值是计算一个昂贵的关闭和你不需要访问它,您可以使用replaceDefaults ()方法相反。它就像setDefaults
只是擦除的前一个值来提高性能。这意味着之前的默认值不可用覆盖时另一个闭包:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25日26日
使用ob娱乐下载\组件\OptionsResolver\选项;使用ob娱乐下载\组件\OptionsResolver\OptionsResolverInterface;/ /……受保护的函数setDefaultOptions(OptionsResolverInterface美元解析器){/ /……美元解析器- >setDefaults (数组(“加密”= >“ssl”,“重”= >函数(选项美元选项){/ /一些沉重的计算创建美元的结果返回美元结果;}));美元解析器- >replaceDefaults (数组(“加密”= >tls的,/ /简单的覆盖“重”= >函数(选项美元选项){/ /美元previousValue不可用/ /……返回美元someOtherResult;}));}
请注意
现有的选项键时没有提到覆盖保存。
配置允许的值
并不是所有的值都是有效的选项的值。假设梅勒
类都有一个运输
选项,它只能是一个sendmail
,邮件
或smtp
。您可以配置这些允许的值通过调用setAllowedValues ():
1 2 3 4 5 6 7 8 9
/ /……受保护的函数setDefaultOptions(OptionsResolverInterface美元解析器){/ /……美元解析器- >setAllowedValues (数组(“加密”= >数组(零,“ssl”,tls的)));}
还有一个addAllowedValues ()方法,您可以使用如果你想添加一个允许价值之前配置允许的值。
配置允许类型
您还可以指定允许的类型。例如,港口
选项可以是任何东西,但它必须是一个整数。您可以配置这些类型通过调用setAllowedTypes ():
1 2 3 4 5 6 7 8 9
/ /……受保护的函数setDefaultOptions(OptionsResolverInterface美元解析器){/ /……美元解析器- >setAllowedTypes (数组(“端口”= >“整数”));}
可能的类型是相关的is_ *
PHP函数或类名。你也可以通过数组类型的值。例如,阵列(“空”、“字符串”)
允许港口
是零
或者一个字符串
。
还有一个addAllowedTypes ()方法,您可以使用一个允许类型添加到先前允许类型。
规范化的选项
一些值需要归一化之前,您可以使用它们。例如,假装主机
应该开始http://
。要做到这一点,您可以编写标准化者。这些闭包将被执行后,所有的选择,应该返回规范化值传递。您可以配置这些标准化者通过调用setNormalizers ():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ /……受保护的函数setDefaultOptions(OptionsResolverInterface美元解析器){/ /……美元解析器- >setNormalizers (数组(“主机”= >函数(选项美元选项,美元价值){如果(“http://”! = = substr (美元价值,0,7)){美元价值=“http://”。美元价值;}返回美元价值;}));}
你看到也会关闭选择美元
参数。有时,您需要使用规范的其他选项:
1 2 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://”。美元价值;}}返回美元价值;}));}