用 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 优雅的校验类初始化选项的主要内容,如果未能解决你的问题,请参考以下文章

校用设备|校用设备课桌椅|校用设备

c++中的cin 和cout 有啥用怎么用 >> <<有啥用怎么用

resource啥时候用单数?啥时候用复数?

测试用例设计:测试用例格式

什么时候用卡方检验,什么时候用t检验,什么时候用u检验

pybot执行多条用例时,某一个用例执行失败,停止所有用例的执行