lemax10 / simple-actions
简单可重用动作模式的实现
v1.0.2
2024-06-12 10:59 UTC
Requires
- php: >=7.4.0
- laravel/framework: >=6.0
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);