devcoder-xyz / php-options-resolver
该库提供了一种简单的解决方案,用于在PHP中处理和验证选项数组。
2.0.0
2024-04-07 11:21 UTC
Requires
- php: >=7.4
Requires (Dev)
- phpunit/phpunit: ~9.4
README
该库提供了一种简单的解决方案,用于在PHP中处理和验证选项数组。
安装
要安装此库,请使用Composer
运行以下Composer命令
composer require devcoder-xyz/php-options-resolver
要求
- PHP版本7.4或更高
定义必需的选项
使用OptionsResolver
和预期的选项定义类所需的选项
<?php use DevCoder\Resolver\Option; use DevCoder\Resolver\OptionsResolver; class Database { public function __construct(array $options = []) { $resolver = new OptionsResolver([ new Option('host'), new Option('username'), new Option('password'), new Option('dbname'), ]); try { $this->options = $resolver->resolve($options); } catch (InvalidArgumentException $e) { throw new InvalidArgumentException("Error: " . $e->getMessage()); } } } // Example usage: try { $database = new Database([ 'host' => 'localhost', 'dbname' => 'app', ]); } catch (InvalidArgumentException $e) { echo "Error: " . $e->getMessage(); // Displays: "Error: The required option 'username' is missing." }
定义默认选项
您还可以使用每个选项的setDefaultValue
设置选项的默认值
<?php class Database { public function __construct(array $options = []) { $resolver = new OptionsResolver([ (new Option('host'))->setDefaultValue('localhost'), (new Option('username'))->setDefaultValue('root'), (new Option('password'))->setDefaultValue('root'), (new Option('dbname'))->setDefaultValue('app'), ]); $this->options = $resolver->resolve($options); } } // Example usage: $database = new Database([]); var_dump($database->getOptions()); // Expected output: // array(4) { // ["host"]=> string(9) "localhost" // ["username"]=> string(4) "root" // ["password"]=> string(4) "root" // ["dbname"]=> string(3) "app" // }
处理不存在的选项
如果提供的选项不在定义的选项列表中,将抛出InvalidArgumentException
<?php class Database { public function __construct(array $options = []) { $resolver = new OptionsResolver([ (new Option('host'))->setDefaultValue('localhost'), (new Option('username'))->setDefaultValue('root'), (new Option('password'))->setDefaultValue('root'), (new Option('dbname'))->setDefaultValue('app'), ]); try { $this->options = $resolver->resolve($options); } catch (InvalidArgumentException $e) { throw new InvalidArgumentException("Error: " . $e->getMessage()); } } } // Example usage: try { $database = new Database([ 'url' => 'mysql://root:root@localhost/app', ]); } catch (InvalidArgumentException $e) { echo "Error: " . $e->getMessage(); // Displays: "Error: The option(s) 'url' do(es) not exist. Defined options are: 'host', 'username', 'password', 'dbname'." }
验证选项值
您可以添加自定义验证器来验证每个选项提供的值
<?php class Database { public function __construct(array $options = []) { $resolver = new OptionsResolver([ (new Option('host'))->validator(static function($value) { return is_string($value); })->setDefaultValue('localhost'), (new Option('username'))->validator(static function($value) { return is_string($value); })->setDefaultValue('root'), (new Option('password'))->validator(static function($value) { return is_string($value); })->setDefaultValue('root'), (new Option('dbname'))->validator(static function($value) { return is_string($value); })->setDefaultValue('app'), (new Option('driver'))->validator(static function($value) { return in_array($value, ['pdo_mysql', 'pdo_pgsql']); })->setDefaultValue('pdo_mysql'), ]); try { $this->options = $resolver->resolve($options); } catch (InvalidArgumentException $e) { throw new InvalidArgumentException("Error: " . $e->getMessage()); } } } // Example usage with an invalid driver value: try { $database = new Database([ 'host' => '192.168.1.200', 'username' => 'root', 'password' => 'root', 'dbname' => 'my-app', 'driver' => 'pdo_sqlite', ]); } catch (InvalidArgumentException $e) { echo "Error: " . $e->getMessage(); // Displays: "Error: The option 'driver' with value 'pdo_sqlite' is invalid." }
当然!让我们具体关注使用Option::new()
以流畅方式实例化选项
使用Option::new()
实例化选项
您可以使用Option::new()
以流畅风格创建和配置选项实例,然后将其添加到OptionsResolver
中。以下是一个展示此方法的示例
<?php use DevCoder\Resolver\Option; use DevCoder\Resolver\OptionsResolver; // Create an option instance using Option::new() $option1 = Option::new('option1'); // Create another option instance with a default value using Option::new() $option2 = Option::new('option2')->setDefaultValue('default'); // Create a resolver and add the configured options $resolver = new OptionsResolver([$option1, $option2]); // Resolve the options with provided values $options = $resolver->resolve([ 'option1' => 'value1', ]);
在此示例中
- 我们使用
Option::new('option1')
创建一个名为'option1'
的Option
实例。 - 类似地,我们使用
Option::new('option2')->setDefaultValue('default')
创建一个名为'option2'
的Option
实例,其默认值为'default'
。 - 然后,在实例化时将这两个选项添加到
OptionsResolver
中。 - 最后,我们通过传递值数组来解析选项,并且只有
'option1'
提供了一个值('value1'
)。
使用Option::new()
提供了一种简洁明了的方式来创建和配置选项实例,然后再用特定值解析它们。
此库非常适合需要以简单有效的方式管理和验证选项的小型项目。