logikostech/class-options

类选项管理器

1.0.0 2017-06-15 18:09 UTC

This package is auto-updated.

Last update: 2024-09-21 20:25:52 UTC


README

Travis CI Coverage Status CodeCov Software License

Logikos\ClassOptions

用法

将其添加到任何类中,如下所示

<?php 

use Logikos\ClassOptions\ConfigurableInterface;
use Logikos\ClassOptions\ConfigurableTrait;
use Logikos\ClassOptions\OptionDefinition;

class Configurable implements ConfigurableInterface {
  use ConfigurableTrait;

  const OPTION_FOO      = 'foo';
  const OPTION_BAR      = 'bar';
  const OPTION_REQUIRED = 'required';
  const OPTION_NO_DASH  = 'noDashes';
  const OPTION_INT_ONLY = 'intOnly';
  const OPTION_DATE     = 'date';

  public function __construct() {
    $this->addOption(self::OPTION_FOO);
    $this->addOption(self::OPTION_BAR);
    $this->defineOption($this->requiredOption());
    $this->defineOption($this->noDashesOption());
    $this->defineOption($this->intOnlyOption());
    $this->defineOption($this->dateOption());
  }
  
  public function execute() {
    if (!$this->validateOptions())
      throw new \Exception('All required options must be set!');
    // code to execute
  }

  private function requiredOption() {
    $o = new OptionDefinition(self::OPTION_REQUIRED);
    $o->makeRequired();
    return $o;
  }

  private function noDashesOption() {
    $o = new OptionDefinition(self::OPTION_NO_DASH);
    $o->setValuePattern('/[^-]+/');
    return $o;
  }

  private function intOnlyOption() {
    $o = new OptionDefinition(self::OPTION_INT_ONLY);
    $o->setValidationHook('is_int');
    return $o;
  }

  private function dateOption() {
    $o = new OptionDefinition(self::OPTION_DATE);
    $o->setValidationHook(function($value) {
      $date = date_parse($value);
      return $date["error_count"] === 0;
    });
    return $o;
  }
}

定义选项

如您所见,特质的用户可以使用defineOption(OptionDefinitionInterface $option)或使用addOption(string 'name')方法定义一个选项。

选项定义

创建一个新的命名选项定义:$o = new OptionDefinition('foo');

这已经足够创建一个选项。但是,如果您想验证可以设置到选项中的值的类型,有几个辅助方法。

  • $o->setValuePattern('/[0-1]+/'); - 使用正则表达式验证值设置
  • $o->setValidationHook('is_int'); - 传递任何可调用函数,并将值作为第一个参数传递给它。如果可调用函数返回false,将抛出异常。
  • $o->setValidationHook(function($value){return (is_int($value) && $value>5);}); - 另一个可调用函数示例。

这些验证将在调用setValue时进行检查,如果验证失败,将抛出异常。

您还可以使用makeRequired()要求设置选项,然后您可以在任何时间调用isValid(),它将全面验证测试模式或可调用的值,并检查是否已设置(如果它是必需的)。尽管isValid()不会抛出异常,它只返回布尔值。尽管它确实检查了模式和可调用的钩子,但技术上它应该只为未设置的必需选项返回false,因为其他验证器在尝试设置值时进行检查,并且您不能在设置值后添加验证器。您实际上无法设置一个无效的值,这样isValid将返回false。