klinikpintar / laravel-repository
laravel应用的CRUD包装器
1.0.0-beta.2
2022-09-27 04:29 UTC
Requires
- php: >=8.1
- laravel/framework: ^9.0
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;
因此,如果请求具有查询page
或limit
,它将发送分页响应,否则它将返回一个包含数据的数组。例如
/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
对象激活或取消激活时调用