fivepercent/enabled-checker

v1.0 2015-06-04 08:44 UTC

This package is not auto-updated.

Last update: 2024-09-28 17:54:38 UTC


README

此包提供检查对象是否启用或禁用的功能。

例如:当您尝试为产品下单并确保其可行性(对象可以下单)时。此外,您可以检查包含该产品的类别是否可以检查或该产品所依赖的其他对象。

安装

在您的 composer.json 中添加 FivePercent/EnabledChecker

{
    "require": {
        "fivepercent/enabled-checker": "~1.0"
    }
}

现在通过运行以下命令告诉 composer 下载库

$ php composer.phar update fivepercent/enabled-checker

基本用法

在使用 EnabledChecker 之前,需要创建和配置检查器实例。

注意:如果需要使用多个检查器,应使用 ChainChecker

use FivePercent\Component\EnabledChecker\Checker\ChainChecker;
use FivePercent\Component\EnabledChecker\EnabledChecker;

$chainChecker = new ChainChecker();
$enabledChecker = new EnabledChecker($chainChecker);

当创建 EnabledChecker 时,可以将检查器添加到 ChainChecker 中。

例如,我们有一个产品和该产品的类别,其结构如下

class Category
{
    public $enabled;
}

class Product
{
    /** @var Category */
    public $category;
    public $enabled;
}

并且我们想要创建一个自定义检查器来检查产品是否启用

use FivePercent\Component\EnabledChecker\Checker\CheckerInterface;

class ProductEnabledChecker implements CheckerInterface
{
    public function isSupported($object)
    {
        return $object instanceof Product;
    }

    public function check($object)
    {
        /** @var Product $object */
        if ($object->category && !$object->category->enabled) {
            // Category is not enabled
            return false;
        }

        if (!$object->enabled) {
            // Product is not enabled
            return false;
        }

        return true;
    }
}

并将此检查器实例添加到 ChainChecker

$chainChecker->addChecker(new ProductEnabledChecker());

在此操作之后,我们可以检查产品是否启用或未启用;)

注意:如果检查器返回 false,则方法 check 抛出异常 FivePercent\Component\EnabledChecker\Exception\NotEnabledException

  1. 产品已禁用

    $product = new Product();
    $product->enabled = false;
    
    $checker->check($product); // Throws exception
  2. 产品已启用

    $product = new Product();
    $product->enabled = true;
    
    $enabledChecker->check($product); // OK
  3. 产品的类别已禁用

    $product = new Product();
    $product->enabled = true;
    $product->category = new Category();
    $product->category->enabled = false;
    
    $enabledChecker->check($product); // Throws exception
  4. 产品和类别都启用

    $product = new Product();
    $product->enabled = true;
    $product->category = new Category();
    $product->category->enabled = true;
    
    $enabledChecker->check($product); // All OK

注意:如果您想要抛出自定义异常,可以实现接口 FivePercent\Component\EnabledChecker\ExceptionAwareInterface.

use FivePercent\Component\EnabledChecker\ExceptionAwareInterface;

class Product implements ExceptionAwareInterface
{
    /** @var Category */
    public $category;
    public $enabled;

    public function getExceptionForNotEnabled()
    {
        if ($this->category && !$this->category->enabled) {
            return new \RuntimeException('Category disabled!');
        }

        if (!$this->enabled) {
            return new \RuntimeException('Project disabled.');
        }

        return null;
    }
}

注意:在简单对象中,可以实现 FivePercent\Component\EnabledChecker\EnabledIndicateInterface,这不需要创建检查器。