执行动作的标准化方式

v1.0.0 2024-06-20 17:19 UTC

This package is auto-updated.

Last update: 2024-09-20 17:53:21 UTC


README

简介

这个库旨在方便您在应用程序中使用的封装、可重复的动作,并对这些动作强制执行业务规则。

示例用例

一个假设的应用程序可能出于各种原因和在不同位置取消订单。为了防止逻辑重复,开发者可能会创建一个名为 "CancelOrder" 的类来定义这个逻辑。

这个库正式化了这个过程,并允许您将业务逻辑附加到它上。例如,如果发货后的订单永远不能取消,您可以在您的动作中定义这个逻辑。

需求

安装

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);

贡献

欢迎贡献和问题。 :)

常见问题解答

这仅仅是花哨的条件块吗?

是的,但也不完全是。该库允许您将复杂(或简单)的集合条件语句包装成一个可以在许多地方重用的块,并标准化抛出的异常。