therour / laravel-actionable
Laravel 框架的单类行为处理器
1.2.1
2019-04-15 01:47 UTC
Requires
- php: ^7.1.3
- illuminate/container: ~5.4
- illuminate/contracts: ~5.4
- illuminate/http: ~5.4
- illuminate/routing: ~5.4
- illuminate/support: ~5.4
Requires (Dev)
- orchestra/testbench: ^3.5
- orchestra/testbench-browser-kit: ^3.5
- phpunit/phpunit: ^7.0
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"
编辑(可选)
- 如果您创建了一个自定义控制器来处理 Actionable 类,可以在配置文件中定义控制器类在
controller
键下。 - 如果您想加载行为路由,请定义您的路由文件或目录路径,因为
web.php
和api.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]); } }