码农造轮子 / actions
执行动作的标准化方式
v1.0.0
2024-06-20 17:19 UTC
Requires
- php: >=8.2
Requires (Dev)
- phpunit/phpunit: ^11.2
README
简介
这个库旨在方便您在应用程序中使用的封装、可重复的动作,并对这些动作强制执行业务规则。
示例用例
一个假设的应用程序可能出于各种原因和在不同位置取消订单。为了防止逻辑重复,开发者可能会创建一个名为 "CancelOrder" 的类来定义这个逻辑。
这个库正式化了这个过程,并允许您将业务逻辑附加到它上。例如,如果发货后的订单永远不能取消,您可以在您的动作中定义这个逻辑。
需求
- Composer
- PHP 8.2 或更高版本
安装
composer require sammakescode/actions
用法
您可以查看 tests
目录中的示例,但这里有一些快速查看的方法。
示例
定义您的业务规则
<?php namespace App; use \SamMakesCode\Actions\BusinessRules\BusinessRulesInterface; class OrderMustNotBeDispatched implements BusinessRulesInterface { public function __construct( private readonly Order $order, ) {} public function isSatisfied(): bool { return !in_array( $this->order->status, [ 'dispatched', 'delivered', 'complete', ] ); } public function getFailureMessage(): string { return 'Cannot perform action because the order has been dispatched!'; } }
定义您的动作
<?php namespace App; use \SamMakesCode\Actions\Actions\BaseAction; class CancelOrder extends BaseAction { public function __construct( private readonly Order $order, ) { $this->registerBusinessRules([ new OrderMustNotBeDispatched($this->order), ]); } public function handle() { $this->order->cancel(); } }
执行您的动作
<?php $order = new \App\Order; $order->status = 'dispatched'; $action = new \App\CancelOrder($order); // Throws \SamMakesCode\Actions\Exceptions\BusinessRulesNotSatisfied because dispatched orders can't be cancelled $action->perform();
注意:当动作上的 perform()
方法被调用时,__call()
魔术方法拦截请求并在执行任何业务规则后调用 handle()
方法。
简写动作
除了手动实例化和执行动作外,您还可以使用 ::do()
简写。
CancelOrder::do($order);
贡献
欢迎贡献和问题。 :)
常见问题解答
这仅仅是花哨的条件块吗?
是的,但也不完全是。该库允许您将复杂(或简单)的集合条件语句包装成一个可以在许多地方重用的块,并标准化抛出的异常。