slexx/laravel-actions

v1.3.3 2020-01-24 21:33 UTC

This package is auto-updated.

Last update: 2024-09-25 08:04:47 UTC


README

用法

问题

大多数应用程序都有多个入口点。例如,用于创建用户的表单、用于移动应用的API,甚至可能有用于创建用户的命令。

然后就会出现代码重复的问题。

class UserController 
{
    public function create(CreateUserRequest $request) 
    {
        $user = new User;
        $user->email = $request->email;
        $user->password = bcrypt($request->password);
        $user->save();
        
        return redirect('users/' . $user->id);
    }
}


class UserApiController 
{
    public function create(CreateUserRequest $request) 
    {
        $user = new User;
        $user->email = $request->email;
        $user->password = bcrypt($request->password);
        $user->save();
        
        return new UserResponse($user);
    }
}

解决方案

最近我通过阅读一篇关于如何在medium的文章,发现了一个优雅的解决方案。

通过添加新类来消除重复

class UserCreateAction 
{
    public function execute(CreateUserRequest $request): User
    {
        $user = new User;
        $user->email = $request->email;
        $user->password = bcrypt($request->password);
        $user->save();
        
        return $user;
    }
}

class UserController 
{
    public function create(CreateUserRequest $request, CreateUserAction $action) 
    {
        return redirect('users/' . $action->execute($request)->id);
    }
}


class UserApiController 
{
    public function create(CreateUserRequest $request) 
    {
        return new UserResponse($action->execute($request));
    }
}

那么这个包具体做什么呢?

它添加了一个不可替代的命令make:action

php artisan make:action Users/CreateUserAction

这将生成以下代码

<?php

namespace App\Actions\Users;

use App\User;
use Slexx\LaravelActions\Action;

class CreateUserAction extends Action
{
    /**
     * @param array $data
     * @return User
     */
    public function execute(array $data)
    {
        $user = User::create($data);

        return $user;
    }
}

安装

您可以通过composer安装此包

composer require slexx/laravel-actions

更新composer后,将服务提供者添加到config/app.php中的providers数组中

Slexx\LaravelActions\ActionsServiceProvider::class,