orzlee/api-assistant

Help you quickly rebuild laravel api application

v2.1.0 2020-12-14 08:54 UTC

This package is auto-updated.

Last update: 2024-05-14 16:18:30 UTC


README

Installation

安装包:

composer require orzlee/api-assistant

发布配置文件

php artisan vendor:publish --provider="Orzlee\ApiAssistant\ApiAssistantServiceProvider"

Configurations

修改app\Exceptions\Handler.php以接管API异常处理:

    use Orzlee\ApiAssistant\Exceptions\ApiExceptionReport;

    public function render($request, Throwable $exception)
    {
        $reporter = ApiExceptionReport::make($exception);
        if ($reporter->shouldCatchException()) {
            return $reporter->report();
        }
        return parent::render($request, $exception);
    }

修改控制器文件

use Orzlee\ApiAssistant\Traits\ApiResponse;
use Orzlee\ApiAssistant\Traits\Controller\QueryRequestFilter;
use Illuminate\Routing\Controller as BaseController;

class Controller extends BaseController
{
    use ApiResponse, QueryRequestFilter;
}

修改模型文件

use Orzlee\ApiAssistant\Traits\Model\AutoLoadRelation;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use AutoLoadRelation;
    
    /**
     * 允许过滤查询的字段,条件字段会匹配该字段,自动过滤掉不包含字段
     * 条件过滤查询也会通过该字段过滤
     * api http://xxx.com/your-api-url?fields=name,created_at&name=test
     * @return string[]
     */
    public static function fields() :array
    {
        return [
            'name',
            'avatar',
            'created_at',
        ];
    }

    /**
     * api url 参数中包含fields=my_post会自动加载关系
     * api http://xxx.com/your-api-url?fields=name,my_post
     * @return string[]
     */
    public static function relationFields() :array
    {
        return [
            'posts' => 'my_post',
        ];
    }

    public function posts()
    {
        return $this->hasMany(Post::class);
    }

}

config/api-assistant.php中还有很多配置。

Use

在控制器中使用:

class PostController extends Controller{
    
    public function __construct(Request $request) {
        $this->init(Post::class, $request);
    }

    public function index(Request $request)
    {
        return $this->success(PostResource::collection($this->get()));
    }

    public function show($id)
    {
        return $this->success(new PostResource($this->query->findOrFail($id)));
    }

    public function update($id, CreatePostRequest $request)
    {
        $post = $this->query->where('user_id', $request->user()->id)->find($id);
        if (!$post) {
            return $this->failed('not found post.', 404);
        }
        $post->update($request->all());
        return $this->success(new PostResource($post));
    }
}

查询例子:

http://xxx.com/your-api-url?fields=id,name,status,created_at&status=!=,1&name=!=,null&orderBy=status,desc&page_size=2&page=2
http://xxx.com/your-api-url?name=like,~test~
http://xxx.com/your-api-url?status=1,or,2
http://xxx.com/your-api-url?status[]=1,or,2&status
//闭包查询,查询sql像这样: select * form post where (status = -1 or state = -2) and name = 'test' order by status;
http://xxx.com/your-api-url?closures[][status]=or,-1&closures[][state]=or,-2&name=test&orderBy=status

模型缓存:

use \App\Traits\Model\HasCache;
use \Illuminate\Database\Eloquent\Model;
class Category extends Model
{
    use HasCache;
    
    /**
     * 自定义缓存和key
     * @return mixed
     */
    public static function getParentCategoryForCache()
    {
        return self::cache('parent_category', function (Category $model) {
            return $model->where('parent_id', 0)->get();
        });
    }
    /**
     * 不传入key值,使用默认key,但是会替换cache函数缓存
     * @return mixed
     */
    public static function getSubCategoryForCache()
    {
        return self::cache(function (Category $model) {
            return $model->where('parent_id', '>', 0)->get();
        });
    }
    
}
use Illuminate\Routing\Controller;
use \Orzlee\ApiAssistant\Traits\ApiResponse;
class CategoryController extends Controller
{
    use ApiResponse;
    public function categories()
    {
        return $this->success(Category::cache());
        //return $this->success(Category::getParentCategoryForCache());
        //清理缓存
        //(new Category)->forgetCache();
        //(new Category)->forgetCache('parent_category');
    }
}