klinikpintar/laravel-repository

laravel应用的CRUD包装器

1.0.0-beta.2 2022-09-27 04:29 UTC

This package is auto-updated.

Last update: 2024-08-27 08:40:11 UTC


README

Laravel-Repository是laravel应用的CRUD包装器

目录

安装

composer require klinikpintar/laravel-repository

创建基本仓库

<?php
namespace App\Repositories;
use App\Models\User as Model;
use KlinikPintar\RepositorySoftDelete;

class UserRepository extends RepositorySoftDelete
{
    /**
     * model
     *
     * @var \Illuminate\Database\Eloquent\Model
     */
    protected $model = Model::class;

    /**
     * fillable data model.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'username', 'email', 'password', 'role'
    ];
}

基本用法

Create user controller
<?php
namespace App\Http\Controllers;
use App\Repositories\UserRepository;
use App\Http\Resources\UserResource;
use App\Http\Requests\User\CreateRequest;
use App\Http\Requests\User\UpdateRequest;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * repository
     *
     * @var \App\Repositories\UserRepository
     */
    protected $repository;

    public function __construct()
    {
        $this->repository = new UserRepository();
    }

    /**
     * get list of companies
     */
    public function getList(Request $request)
    {
        $collection = $this->repository->getList($request);

        return UserResource::collection($collection);
    }

    /**
     * get detail of companies
     */
    public function getDetail(Request $request, int $id)
    {
        $user = $this->repository->getDetail($request, $id);

        return new UserResource($user);
    }

    /**
     * create User
     */
    public function create(CreateRequest $request)
    {
        $user = $this->repository->create($request);

        return (new UserResource($user))->additional([
            'message' => 'User has been created'
        ]);
    }

    /**
     * update User
     */
    public function update(UpdateRequest $request, int $id)
    {
        $user = $this->repository->update($request, $id);

        return (new UserResource($user))->additional([
            'message' => 'User has been updated'
        ]);
    }

    /**
     * activate User
     */
    public function activate(Request $request, int $id)
    {
        $user = $this->repository->activate($request, $id);

        return (new UserResource($user))->additional([
            'message' => 'User has been activated'
        ]);
    }

    /**
     * inactive User
     */
    public function inactive(Request $request, int $id)
    {
        $user = $this->repository->inactive($request, $id);

        return (new UserResource($user))->additional([
            'message' => 'User has been inactived'
        ]);
    }

    /**
     * delete User
     */
    public function delete(Request $request, int $id)
    {
        $user = $this->repository->delete($request, $id);

        return (new UserResource($user))->additional([
            'message' => 'User has been deleted'
        ]);
    }

    /**
     * restore User
     */
    public function restore(Request $request, int $id)
    {
        $user = $this->repository->restore($request, $id);

        return (new UserResource($user))->additional([
            'message' => 'User has been restored'
        ]);
    }

    /**
     * forceDelete User
     */
    public function forceDelete(Request $request, int $id)
    {
        $user = $this->repository->forceDelete($request, $id);

        return (new UserResource($user))->additional([
            'message' => 'User has been force deleted'
        ]);
    }
}

然后创建路由

Route::prefix('/user')->group(function () {
    Route::get('/', [UserController::class, 'getList'])->name('user.list');
    Route::get('/{id}', [UserController::class, 'getDetail'])->name('user.detail');
    Route::post('/', [UserController::class, 'create'])->name('user.create');
    Route::put('/{id}', [UserController::class, 'update'])->name('user.update');
    Route::put('/{id}/activate', [UserController::class, 'activate'])->name('user.activate');
    Route::put('/{id}/inactive', [UserController::class, 'inactive'])->name('user.inactive');
    Route::pute('/{id}/restore', [UserController::class, 'restore'])->name('user.restore');
    Route::delete('/{id}', [UserController::class, 'delete'])->name('user.delete');
    Route::delete('/{id}', [UserController::class, 'forceDelete'])->name('user.force-delete');
});

列表修改器

列表修改器有4个主要功能

分页

当请求列表端点时,响应可以是分页或不分页,取决于对象的行为,默认情况下是启用的,但您可以通过将属性$paginationable设置为false来禁用。

    /**
     * paginationable.
     *
     * @var bool
     */
    protected $paginationable = false;
必需分页

当数据库中的对象数据量较大时,应进行分页,因此如果您请求例如/user端点,它将返回Laravel的LengthAwarePaginator响应。

可选分页

当数据库中的数据量不是很大,但最好进行分页时,称为可选分页。要使用此功能,只需将属性$optionalPagination设置为默认值false即可。

    /**
     * optional pagination.
     *
     * @var bool
     */
    protected $optionalPagination = true;

因此,如果请求具有查询pagelimit,它将发送分页响应,否则它将返回一个包含数据的数组。例如

  • /user将不会分页
  • /user?page=1 分页
  • /user?limit=15 分页
  • /user?page=2&limit=10 分页
过滤

过滤非常灵活,您可以根据需要定义多少。

    /**
     * apply filter.
     */
    protected function applyFilter(Request $request, Builder &$builder): void
    {
        if ($request->query('role')) {
            $builder->whereRole($request->role);
        }
    }

因此,如果您请求/user?role=admin,它将应用过滤器。

排序

属性$sortable默认启用

    /**
     * sortable.
     *
     * @var bool
     */
    protected $sortable = true;

    /**
     * field allowed to sort.
     *
     * @var array
     */
    protected $sortAllowedFields = ['id'];

    /**
     * default sort field.
     *
     * @var string
     */
    protected $defaultSortField = null;

首先定义允许排序的字段,然后根据需要设置默认排序字段。默认排序是升序,但如果您需要降序列表,可以传递查询descending=true

关系加载

有时我们需要在请求时加载对象关系,要启用此功能,请将属性$relationable设置为true

    /**
     * relationable.
     *
     * @var bool
     */
    protected $relationable = true;

    /**
     * field allowed to get relation.
     *
     * @var array
     */
    protected $relationAllowed = ['contact', 'parent', 'parent.contact'];

    /**
     * relation autoload.
     *
     * @var mixed
     */
    protected $relation = null;

然后您可以通过请求user?with=contact,parent来进行。

事件

事件非常有用,可以定义过程的副作用,您可以通过添加方法来在仓库中使用事件。

    /**
     * on User created
     * 
     * @var \Illuminate\Http\Request
     * @var \Illuminate\Database\Eloquent\Model
     */
    public function onCreated(CreateRequest $request, User $user): void
    {
        $user->contact->create([...]);
    }

此事件将在用户创建后调用,可用的事件有

  • onCreated 创建时调用
  • onSaved 创建或更新时调用
  • onUpdated 更新时调用
  • onDeleted 软删除或删除时调用
  • onForceDeleted 强制删除时调用
  • onRestored 恢复时调用
  • onActivated 如果实现了激活对象时调用
  • onInactivated 如果实现了取消激活对象时调用
  • onStatusChanged 对象激活或取消激活时调用