OptionsResolver组件

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.5,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 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 ();美元- >选择=美元解析器- >解决(美元选项);}

现在的选择属性是一个良好定义的数组所有解决选项可用:

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
使用欧宝娱乐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 '

如果你不通过需要选择,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
使用欧宝娱乐app下载地址\组件\OptionsResolver\选项;使用欧宝娱乐app下载地址\组件\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
使用欧宝娱乐app下载地址\组件\OptionsResolver\选项;使用欧宝娱乐app下载地址\组件\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日
使用欧宝娱乐app下载地址\组件\OptionsResolver\选项;使用欧宝娱乐app下载地址\组件\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 ()方法,您可以使用如果你想添加一个允许价值之前配置允许的值。

2.5

回调支持允许的值是在Symfony 2.5中引入的。欧宝娱乐app下载地址

如果你需要添加更多的逻辑值的验证过程中,你可以通过一个可调用作为允许的值:

1 2 3 4 5 6 7 8 9 10 11
/ /……受保护的函数setDefaultOptions(OptionsResolverInterface美元解析器){/ /……美元解析器- >setAllowedValues (数组(“交通”= >函数(美元价值){返回! = =(大小写敏感美元价值,“邮件”);}));}

谨慎

注意,使用这一起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://”美元价值;}}返回美元价值;}));}
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。