naucon/command

描述文本

1.0.0 2017-12-18 20:14 UTC

This package is auto-updated.

Last update: 2024-08-29 04:48:27 UTC


README

关于

此包提供了一个通用的命令模式来执行操作或任务。目标是把大型的业务逻辑分割成更小的操作/任务,这些操作/任务松散耦合、易于阅读、易于维护且易于替换。

兼容性

  • PHP5.5+

安装

使用composer安装最新版本

composer require naucon/command

使用方法

创建CommandManager实例

$manager = new CommandManager();

将命令注册到管理实例

$manager->register('foo', new FooAction());
$manager->register('bar', new BarAction());

执行命令

$request = new FooRequest();

$response = $manager->execute($request)

创建请求

class MyRequest
{

}

创建操作(命令)

use Naucon\Command\CommandInterface;

class MyAction implements CommandInterface
{
    /**
     * @param mixed $request
     * @return mixed response
     */
    public function execute($request)
    {
        // do something ....
       
        return true;
    }

    /**
     *
     * @param mixed $request
     * @return bool     returns true if request is support, else false
     */
    public function support($request)
    {
        return $model instanceof MyRequest;
    }
}

数据应通过Request传递到Action

class PowerOnRequest
{
    /**
     * @var Light
     */
    protected $light;

    /**
     * Constructor
     *
     * @param Light $light
     */
    public function __construct(Light $light)
    {
        $this->light = $light;
    }

    /**
     * @return Light
     */
    public function getLight()
    {
        return $this->light;
    }
}

为了在Action中执行Action,类需要CommandManager的实例。为了注入CommandManager,将CommandManagerAwareInterface实现到Action中。该接口通过调用setCommandManager()触发CommandHydratorCommandManager注入到Action中。可以使用CommandManagerAwareTrait来添加属性和设置器。

class MyAction implements CommandInterface, CommandManagerAwareInterface
{
    use CommandManagerAwareTrait;

    ...

    public function execute($request)
    {
        $request = new MySubRequest();
        $response = $this->commandManager->execute($request);
        return $response;
    }

要将其他类型的数据注入到操作中,可以向CommandHydrator添加自定义处理器。处理器必须实现ProcessorInterface。通过调用CustomerManager::addProcessor()添加自定义处理器。第二个参数是可选的$priority(默认值为0)。

$manager = new CommandManager();
$manager->addProcessor(new MyProcessor());

在某些罕见情况下,如果有嵌套的子请求,可能有必要中断工作流程并立即发送HTTP响应或重定向(通常不推荐)。因此,可以在操作(命令)中抛出实现ResponseInterfaceLogicException

use Naucon\Command\CommandInterface;
use Naucon\Command\Response\HttpRedirect;

class MyAction implements CommandInterface
{
    /**
     * @param mixed $request
     * @return mixed response
     */
    public function execute($request)
    {
        // do something ....
       
        throw new HttpRedirect($url, $statusCode, $headers);
        
        // or
        
        throw new HttpResponse($content, $statusCode, $headers);
    }
...

示例

启动内置的web服务器以查看示例操作

cd examples
php -S 127.0.0.1:3000

在浏览器中打开URL

http://127.0.0.1:3000/index.html

致谢

此实现深受payum支付处理库的启发。模块化和解耦的架构不仅可以用于处理支付,在许多其他用例中也非常有用。

许可证

MIT许可证(MIT)

版权所有 (c) 2015 Sven Sanzenbacher

特此授予任何获得此软件及其相关文档副本(“软件”)的人免费权限,在软件不受限制的情况下处理软件,包括但不限于使用、复制、修改、合并、发布、分发、转授和/或出售软件副本,以及允许向提供软件的人做上述事项,前提是

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定目的和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论此类索赔、损害或其他责任是基于合同、侵权或其他方式,是否与软件或软件的使用或其他交易有关。