用 symfony/options-resolver 优雅的校验类初始化选项
Posted guanguans
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用 symfony/options-resolver 优雅的校验类初始化选项相关的知识,希望对你有一定的参考价值。
示例类
use Symfony\\Component\\OptionsResolver\\OptionsResolver;
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\');
});
}
}
选项通过校验
$email = new Email([
\'host\' => \'smtp.example.org\',
\'username\' => \'user\',
\'password\' => \'password\',
\'port\' => 25,
]);
var_export($email);
Email::__set_state(array(
\'options\' =>
array (
\'host\' => \'smtp.example.org\',
\'username\' => \'user\',
\'password\' => \'password\',
\'port\' => 25,
),
))
选项未通过校验
$email = new Email([
\'host\' => \'smtp.example.org\',
\'username\' => \'user\',
\'password\' => \'password\',
\'port\' => \'25\', // 注意这里
]);
var_export($email);
php Fatal error: Uncaught Symfony\\Component\\OptionsResolver\\Exception\\InvalidOptionsException: 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 优雅的校验类初始化选项的主要内容,如果未能解决你的问题,请参考以下文章