lemax10/simple-actions

简单可重用动作模式的实现

安装: 17

依赖: 0

建议者: 0

安全: 0

星标: 3

关注者: 2

分支: 0

公开问题: 0

类型:package

v1.0.2 2024-06-12 10:59 UTC

This package is auto-updated.

Last update: 2024-09-12 11:46:51 UTC


README

简单动作方法的实现。该方法的核心思想是每个动作对应一个对象。某种程度上类似于laravel actions,但实现更为简化,不涉及复杂的环境上下文。

动作(action)

记住,每个动作应该对应一个对象。我们将实现一个动作对象。

示例

<?php
declare(strict_types=1);
namespace Example/Actions;

use LeMaX10\SimpleActions\Action;

/**
 * @method ExampleModel run(int $id)
 */
final class ExampleAction extends Action
{
    protected function handle(int $id): ExampleModel
    {
        return ExampleModel::findOrFail($id);
    }
}

var_dump(ExampleAction::make()->run(1)); // (ExampleModel)

单事务动作

单事务动作可以是多个动作的组合,也可以是多个要求保持一致性和在单个事务中实现的数据库查询。为了实现单事务动作,需要在对象中定义一个属性:在$singleTransaction中设置值为true

<?php
declare(strict_types=1);
namespace Example/Actions;

use LeMaX10\SimpleActions\Action;

/**
 * @method ExampleContactModel run(string $email, string $name)
 */
final class ExampleAction extends Action
{
    protected bool $singleTransaction = true;

    protected function handle(string $email, string $name): ExampleContactModel
    {
        $contact = new ExampleContactModel([
                'name' => $name
            ]);

        $contact->email()->associate($this->getEmailModel($email));
        $contact->save();
        return $contact;
    }

    private function getEmailModel(string $email): ExampleEmailModel
    {
        return ExampleEmailModel::firstOrCreate([
                'email' =>
            ]);
    }
}

var_dump(ExampleAction::make()->run('example@domain.com', 'User Name')); // (ExampleContactModel) ['name' => 'User Name', 'email' => (ExampleEmailModel) ['email' => 'example@domain.com']]

可缓存动作

每个动作都支持结果缓存。在这种情况下,当使用相同的参数重复调用动作时,将返回缓存的数据。

<?php
declare(strict_types=1);
namespace Example/Actions;

use LeMaX10\SimpleActions\Action;

/**
 * @method ExampleModel run()
 */
final class ExampleAction extends Action
{
    protected function handle(): array
    {
        return ExampleContactModel::get()->all();
    }
}

// Simple in 10 minutes
var_dump(ExampleAction::make()->remember('exampleKey', 10)->run()); // ['1', '2', 3']

// Forever
var_dump(ExampleAction::make()->rememberForever('exampleKey')->run()); // ['1', '2', 3']

// Tags cache
var_dump(ExampleAction::make()->tags(['exampleTag1', 'exampleTag2'])->remember('exampleKey')->run()); // ['1', '2', 3']

辅助方法的说明

ExampleAction::make() - 创建动作对象实例

->run(...) - 调用动作的实现。签名由动作对象定义

->remember(string $key[, Closure|\DateTimeInterface|\DateInterval|int|null $ttl]) - 动作的结果应该被缓存并重复使用

->rememberForever(string $key) - 动作的结果应该永久缓存并重复使用

->tags(array $tags) - 设置缓存数据的标签。

修改和扩展

考虑到方法的本质,当前实现不提供动作的扩展。动作的调用通过Laravel Container进行,这意味着您可以随时替换某个动作的实现,包括全局替换,只要保持动作的签名即可。

示例重写

app()->bind(ExampleAction::class, CustomExampleAction::class);