saineshmamgain / laravel-repositories
为Laravel应用程序创建存储库的包。
Requires (Dev)
- nunomaduro/collision: ^5.3
- orchestra/testbench: ^6.18
- phpunit/phpunit: ^9.5
README
Laravel Repositories 是一个Laravel包,可以轻松创建和管理存储库。
安装
使用包管理器 composer 安装此包。
composer require saineshmamgain/laravel-repositories
用法
创建存储库
#php artisan make:repository {ModelName}
php artisan make:repository User
此命令将在 App\Repositories 命名空间中创建一个 UserRepository。
插入记录
// In UsersController use App\Http\Controllers\Controller; use App\Repositories\UserRepository; use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; class UsersController extends Controller{ public function store(Request $request) { $validator = Validator::make($request->all(), [ 'name' => 'required', 'email' => 'required' 'password' => 'required' ]); $validated = $validator->validated(); UserRepository::init() ->create($validated); return redirect()->back(); } }
更新记录
// In UsersController use App\Http\Controllers\Controller; use App\Repositories\UserRepository; use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; use App\Models\User; class UsersController extends Controller{ public function update(Request $request, User $user) { $validator = Validator::make($request->all(), [ 'name' => 'required', 'email' => 'required' 'password' => 'required' ]); $validated = $validator->validated(); UserRepository::init($user) ->update($validated); return redirect()->back(); } }
删除记录
此包还支持 软删除。默认情况下,如果模型使用了 软删除,则包将检查模型是否使用 软删除,如果是,则将模型 软删除。要永久删除模型,请在调用 destroy(true) 方法时传递 true。
// In UsersController use App\Http\Controllers\Controller; use App\Repositories\UserRepository; use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; use App\Models\User; class UsersController extends Controller{ public function destroy(Request $request, User $user) { UserRepository::init($user) ->destroy(); return redirect()->back(); } }
从模型查询
Laravel 已经提供了一种编写查询的优雅抽象,因此使用存储库进行查询是可选的。您可以直接使用模型编写查询。但如果您仍然想使用存储库进行查询,则存储库提供了一个 query() 方法,该方法代理模型。在调用 query() 方法后,您可以链式调用所有由 Eloquent 提供的方法。
// In UsersController use App\Http\Controllers\Controller; use App\Repositories\UserRepository; use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; use App\Models\User; class UsersController extends Controller{ public function index(Request $request) { $users = UserRepository::init() ->query() ->where('status', '=', 1) ->paginate(); return view('users.index')->with(compact('users')); } }
存储库钩子
此包为 create、update、destroy 和 restore 方法提供了一些钩子。
钩子列表如下
- 对于
create方法,有beforeCreate和afterCreate。 - 对于
update方法,有beforeUpdate和afterUpdate。 - 对于
destroy方法,有beforeDestroy。 - 对于
restore方法,有afterRestore。 - 还有额外的
beforeSave和afterSave钩子,它们适用于create和update方法。
钩子用法
让我们假设您想在创建或更新用户时对密码进行散列。
// In App\Repositories\UserRepository create a method beforSave protected function beforeSave($fields) { if(array_key_exists('password', $fields)){ $fields['password'] = Hash::make($fields['password']); } return $fields; }
就这样!现在,对于每次创建和更新操作,密码字段都将被散列。是的,别忘了检查 password 键是否存在于 $fields 数组中。
$fields 是在调用 create 或 update 方法时传递的字段数组。
现在让我们看看另一个稍微复杂一点的例子
假设您在创建用户时提交了一个表单,该表单还有一个名为 roles 的字段。由于 users 表没有 roles 列,因此在调用 create 方法时,存储库将抛出异常。
您可以使用钩子解决这个问题。
// In App\Repositories\UserRepository create a method beforSave protected function beforeSave($fields) { if(array_key_exists('roles', $fields)){ unset($fields['roles']); } return $fields; } protected function afterSave($orignal_fields, $fields) { if(array_key_exists('roles', $orignal_fields)){ $this->model->roles()->sync($orignal_fields['roles']); } return $this->model; }
三个方法 afterSave、afterCreate 和 afterUpdate 都会接收到两个参数 $original_fields,这些是最初提交的字段,以及 $fields,这些是在使用 before 钩子返回的字段。因此,您可以在创建/更新记录时安全地删除所有不需要的字段,并在创建/更新记录后使用它们。
钩子和它们的返回值列表
protected function beforeCreate(array $fields) { return $fields; } protected function afterCreate(array $original_fields, array $fields) { return $this->model; } protected function beforeUpdate(array $fields) { return $fields; } protected function afterUpdate(array $original_fields, array $fields) { return $this->model; } protected function beforeSave(array $fields) { return $fields; } protected function afterSave(array $original_fields, array $fields) { return $this->model; } protected function beforeDestroy(bool $isSoftDeletable, bool $permanent) { return $this->model; } protected function afterRestore() { return $this->model; }
接下来是什么
- 编写更多测试
贡献
欢迎提交拉取请求。对于重大更改,请先创建一个问题以讨论您想要更改的内容。
请在提交 PR 之前确保测试。