raid/core-action

Raid Core Action 包

dev-main 2024-02-23 20:23 UTC

This package is auto-updated.

Last update: 2024-09-23 21:43:34 UTC


README

此包负责处理系统中的所有操作。

安装

composer require raid/core-action

配置

php artisan core:publish-action

使用

class UserController extends Controller
{
    /**
     * Invoke the controller method.
     */
    public function __invoke(Request $request, CreateUserAction $action)
    {
        $action->execute($request->only(['name', 'email', 'password']));
    
        // or using the static call
        CreateUserAction::exec($request->only(['name', 'email', 'password']));
    }
}

如何操作

让我们从我们的动作类 CreateUserAction 开始。

您可以使用命令创建动作类。

php artisan make-action CreateUserAction
<?php

namespace App\Actions;

use Raid\Core\Action\Actions\Contracts\ActionInterface;
use Raid\Core\Action\Actions\Action;

class CreateUserAction extends Action implements ActionInterface
{
    /**
     * {@inheritdoc}
     */
    public const ACTION = '';

    /**
     * {@inheritDoc}
     */
    public const ACTIONABLE = '';

    /**
     * Handle the action.
     */
    public function handle()
    {
    }
}

动作类必须实现 ActionInterface 接口。

动作类必须扩展 Action 类。

动作类必须定义 ACTION 常量,即动作名称。

动作类必须定义 ACTIONABLE 常量,即与动作相关的可操作类。

动作类必须定义 handle 方法,该方法将在执行动作时被调用。

让我们完成我们的动作类。

<?php

namespace App\Actions;

use App\Models\User;
use Raid\Core\Action\Actions\Contracts\ActionInterface;
use Raid\Core\Action\Actions\Action;

class CreateUserAction extends Action implements ActionInterface
{
    /**
     * {@inheritdoc}
     */
    public const ACTION = 'create';

    /**
     * {@inheritDoc}
     */
    public const ACTIONABLE = User::class;

    /**
     * Handle the action.
     */
    public function handle(array $data): User
    {
        return $this->actionable()->create($data);
    }
}

handle 方法将在执行动作时被调用。

actionable 方法将返回动作相关的模型。

现在我们已经准备好执行动作了。

class UserController extends Controller
{
    /**
     * Invoke the controller method.
     */
    public function __invoke(Request $request, CreateUserAction $action)
    {
        $user = $action->execute($request->only(['name', 'email', 'password']));
    }
}

用户已创建,一切正常,但我们可以更结构化我们的模式。

从模型执行动作

我们需要在我们的可操作类中使用 Actionable 特性。

这允许我们从可操作类本身执行动作,并将该类与其动作相关联。

<?php

namespace App\Models;

use Raid\Core\Action\Traits\Action\Actionable;

class User extends Account
{
    use Actionable;
}

我们可以以两种方式定义动作。

  • 定义 getActions 方法。
<?php

namespace App\Models;

use Raid\Core\Action\Traits\Action\Actionable;

class User extends Account
{
    use Actionable;
    
    /**
     * Get eventable actions.
     */
    public static function getActions(): array
    {
        return [
            // here we define our action classes.
            CreateUserAction::class,
        ];
    }
}
  • 或在 config/action.php 文件中定义带有动作的可操作类。
'actions' => [
    // here we define our actionable class.
    User::class => [
        // here we define our action classes.
        CreateUserAction::class,
    ],
], 

现在我们可以从模型本身执行动作。

class UserController extends Controller
{
    /**
     * Invoke the controller method.
     */
    public function __invoke(Request $request)
    {
        $user = User::action('create', $request->only(['name', 'email', 'password']));
    }
}

动作将被执行,并将创建模型。


就是这样。

许可

MIT 许可证(MIT)。有关更多信息,请参阅许可文件

鸣谢

安全性

如果您发现任何安全相关的问题,请通过电子邮件报告,而不是使用问题跟踪器。

关于Raid

Raid 是由 Mohamed Khedr 创建的 PHP 框架,由 Mohamed Khedr 维护。

支持Raid

Raid 是一个 MIT 许可的开源项目。它是一个独立项目,其持续发展得以实现。