kint/vo

此包已被废弃,不再维护。未建议替代包。

简单而强大的不可变值对象。

1.1.6 2016-12-09 08:35 UTC

This package is not auto-updated.

Last update: 2020-01-24 16:11:19 UTC


README

Build Status Scrutinizer Code Quality Code Coverage Codacy Badge Maintainability SensioLabsInsight Packagist PRs Welcome

值对象 (VO) - 它是参数的不可变容器,只知道关于你的 参数(如何设置/获取它们)以及关于 验证规则(允许某些参数的数据类型)。你不允许使用无效参数创建 VO(将抛出异常) - 它为你提供了确保 VO 始终有效 的机会。此外,VO 是 不可变的 - 因此你处于安全的一方,没有人会修改你创建后的 VO!

主要优点:现在你可以在任何地方使用这个 VO,你不必担心验证,你不必在每一层应用逻辑(控制器、服务、模型等)中将你的业务逻辑与验证代码混合,你还可以将其用作 类型提示,因此你的代码将更加清晰、面向接口且更精确。

安装

通过 composer: composer require kint/vo

用法

值对象类

<?php

namespace VO;

use ValueObject\ValueObject;

/**
 * @method string getName Gets name.
 * @method string getEmail Gets email.
 */
class SecretAgent extends ValueObject
{
     protected function getRules()
     {
        return [
            'name' => ['NotBlank', 'Length' => ['min' => 5]],
            'email' => ['NotBlank', 'Email', 'Length' => ['min' => 15]],
        ];
     }
}

getRules - 必须实现的方法,返回值对象属性的验证规则。
这些规则 - Symfony 验证器!因此你拥有 Symfony 验证的所有功能在你的 VO 中!
所有可用的验证规则(约束)列表 在此

现在你可以创建 VO 的新实例

$secretAgent = new VO\SecretAgent(['name' => 'Bond', 'email' => 'james.bond@mi6.com']);
// Now you can use magic methods and get values from your VO.
$secretAgentName = $secretAgent->getName();
$secretAgentEmail = $secretAgent->getEmail();
// Also you can pass this VO as parameter.
$controller->doSomethingWithSecretAgent($secretAgent);

如果数据无效 - 你将收到包含所有违反规则的异常

use VO\SecretAgent;
use ValueObject\Exception\ValidationException;

try {
    $secretAgent = new SecretAgent(['name' => 'Bond', 'email' => 'error']);
} catch (ValidationException $e) {
    $errors = $e->getMessages();
}

结果你的代码将非常简单,就像这样

class SecretAgentController
{
    public function indexAction(array $postData)
    {
        (new SecretAgentService())->doSomethingWithSecretAgent(new VO\SecretAgent($postData));
    }
}

class SecretAgentService
{
    public function doSomethingWithSecretAgent(VO\SecretAgent $secretAgent)
    {
        (new SecretAgentModel())->update($secretAgent);
    }
}

class SecretAgentModel
{
    public function update(VO\SecretAgent $secretAgent)
    {
        $secretAgentName = $secretAgent->getName();
        $secretAgentEmail = $secretAgent->getEmail();
        // Update model.
    }
}

享受! :)

有关带有自定义验证规则和后验证行为的示例 在此

可选参数和默认值

可选参数和默认值超出了值对象的范围,你必须在创建值对象之前为可选参数分配默认值。

值对象 vs 表单

值对象看起来与表单有点相似,但关键区别是,你无法在任何地方都依赖表单,因为表单可能在任何时刻有效或无效,你总是需要检查 $form->isValid();,但与值对象不同,你 100% 确定 它始终有效,因此你可以轻松地在任何地方使用它!!!