示例类
复制代码
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70use SymfonyComponentOptionsResolverOptionsResolver; class Email { private $options; /** * Email constructor. * * @param array $options */ public function __construct(array $options = []) { $this->setOptions($options); } /** * Configuration options. * * @param Closure $closure * @param null $object * * @return array */ protected function configureOptions(array $options, Closure $closure, $object = null) { $resolver = new OptionsResolver(); $closure($resolver); if ($object instanceof Closure) { return $object()->options = $resolver->resolve($options); } if (is_object($object)) { return $object->options = $resolver->resolve($options); } if (is_string($object) && class_exists($object)) { $object = new $object(); return $object->options = $resolver->resolve($options); } return $resolver->resolve($options); } /** * @return mixed */ public function getOptions() { return $this->options; } /** * @param array $options */ public function setOptions(array $options): void { $this->options = $this->configureOptions($options, function (OptionsResolver $resolver) { $resolver->setDefaults([ 'host' => 'smtp.example.org', 'username' => 'user', 'password' => 'password', 'port' => 25, ]); $resolver->setRequired(['host', 'username', 'password', 'port']); $resolver->setAllowedTypes('host', 'string'); $resolver->setAllowedTypes('username', 'string'); $resolver->setAllowedTypes('password', 'string'); $resolver->setAllowedTypes('port', 'int'); }); } }
选项通过校验
复制代码
1
2
3
4
5
6
7
8
9
10$email = new Email([ 'host' => 'smtp.example.org', 'username' => 'user', 'password' => 'password', 'port' => 25, ]); var_export($email);
复制代码
1
2
3
4
5
6
7
8
9
10Email::__set_state(array( 'options' => array ( 'host' => 'smtp.example.org', 'username' => 'user', 'password' => 'password', 'port' => 25, ), ))
选项未通过校验
复制代码
1
2
3
4
5
6
7
8
9
10$email = new Email([ 'host' => 'smtp.example.org', 'username' => 'user', 'password' => 'password', 'port' => '25', // 注意这里 ]); var_export($email);
复制代码
1
2
3PHP Fatal error: Uncaught SymfonyComponentOptionsResolverExceptionInvalidOptionsException: The option "port" with value "25" is expected to be of type "int", but is of type "string".
总结
个人觉得可使用该 symfony/options-resolver 组件较好的对开发第三方 sdk 的客户端类初始化参数进行校验,例如个人适配的 Yii 极光推送扩展包 - yii-jpush 中的应用。
最后
以上就是长情金毛最近收集整理的关于用 symfony/options-resolver 优雅的校验类初始化选项的全部内容,更多相关用内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复