therour/laravel-actionable

Laravel 框架的单类行为处理器

1.2.1 2019-04-15 01:47 UTC

This package is auto-updated.

Last update: 2024-09-15 14:07:04 UTC


README

Laravel Actionable 用于创建单类行为并使路由变得简单。

安装

Composer

使用 composer 命令安装

composer require therour/laravel-actionable

服务提供者

版本 >= Laravel 5.5 将自动附加,无需操作。对于 版本 < Laravel 5.5,请在 config/app.php 中将 Therour\Actionable\Providers\ServiceProvider::class 添加到提供者数组中

'providers' => [
    ...
    /*
    * Package Service Providers...
    */
    ...
    Therour\Actionable\Providers\ServiceProvider::class,
    ...
],

配置

发布

php artisan vendor:publish --provider "Therour\Actionable\Providers\ServiceProvider::class"

编辑(可选)

  1. 如果您创建了一个自定义控制器来处理 Actionable 类,可以在配置文件中定义控制器类在 controller 键下。
  2. 如果您想加载行为路由,请定义您的路由文件或目录路径,因为 web.phpapi.php 具有默认控制器命名空间,所以我们无法加载具有不同命名空间的默认行为控制器。

使用

路由

创建一个路由文件,默认为 routes/actions.php,并添加行为路由。或者,您也可以编辑 config/actionable.php 配置中的 route_path

<?php

Route::action('GET', '/users/{id}', App\User\Actions\GetUser::class);

// If you need to define your FormRequest class
Route::action('POST', '/users', App\user\Actions\CreateUser::class);

创建一个行为

创建一个实现 Therour\Actionable\Contracts\Actionable 接口的类 注意:您可以在 __construct() 方法中注入依赖项。

路由参数 {id} 将传递到行为类 run 方法的 $id 变量。

use Therour\Actionable\Contracts\Actionable;
use App\User\Models\User;

class GetUser implements Actionable
{
    /**
     * @var mixed
     */
    protected $result;

    /**
     * @var \App\User\Models\User
     */
    protected $model;

    /**
     * Initiate a single action class
     */
    public function __construct(User $model)
    {
        $this->model = $model;
    }

    /**
     * Start running the action
     * 
     * @var array $data
     * @return mixed
     */
    public function run($id)
    {
        return $this->result = $this->model->find($id);
    }
}

创建参数以过滤和验证参数

您可以通过在 Actionable 类run 方法中类型提示 Param 类来定义 Param 类以过滤和验证参数,所有请求数据都将传递到 Param 类。

通过定义 rules 静态方法,我们的默认控制器将在运行行为之前对其进行验证。

use Therour\Actionable\Params\AbstractParam;

class CreateUserParam extends AbstractParam
{
    private $name;

    private $email;

    public function getName()
    {
        return $this->name;
    }

    public function getEmail()
    {
        return strtolower($this->email);
    }

    public static function rules()
    {
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users'
        ];
    }
}
参数使用
...
public function run(CreateUserParam $param)
{
    // load all filtered parameters. with `getParameters()`
    // $this->model->create($param->getParameters())

    $this->model->create([
        'user' => $param->getName(),
        'email' => $param->getEmail()
    ]);
}
...

或者,您也可以在不使用行为路由的情况下运行行为。

public function blabla(Request $request, CreateUser $action, CreateUserParam $param)
{
    $param->create($request->all())
        ->validate();

    $user = $action->run($param);

    return $user;
}

修改为 Http 响应

您可以通过实现 Laravel 的 Responsable 接口并添加行为类内的 toResponse($request) 方法来使用它。

...
use Illuminate\Http\JsonResponse;

class GetUser implements Actionable, Responsable
{
    ...

    /**
     * Create an HTTP response that represents the object.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function toResponse($request)
    {
        // accessing the result of `run` method by assigned `result` attribute
        return new JsonResponse(['data' => $this->result]);
    }
}