kint / vo
此包已被废弃,不再维护。未建议替代包。
简单而强大的不可变值对象。
1.1.6
2016-12-09 08:35 UTC
Requires
- phpunit/phpunit: ^5.6
- symfony/validator: ^3.1
This package is not auto-updated.
Last update: 2020-01-24 16:11:19 UTC
README
值对象 (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% 确定 它始终有效,因此你可以轻松地在任何地方使用它!!!