关于php:用-symfonyoptionsresolver-优雅的校验类初始化选项

68次阅读

共计 1482 个字符,预计需要花费 4 分钟才能阅读完成。

示例类

use Symfony\Component\OptionsResolver\OptionsResolver;
/**
* Class Email
* composer require symfony/options-resolver
*/
class Email
{
/**
* Email constructor.
*
* @param array $options
*/
public function __construct(array $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');
});
}
/**
* @param array $options
* @param \Closure $closure
*/
public function configureOptions(array $options, Closure $closure)
{
$resolver = new OptionsResolver;
$closure($resolver);
$this->options = $resolver->resolve($options);
}
}

正确的选贤

$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 中的利用。

正文完
 0