saineshmamgain/laravel-repositories

为Laravel应用程序创建存储库的包。

1.0.8 2021-10-27 16:25 UTC

This package is auto-updated.

Last update: 2024-09-29 06:03:06 UTC


README

Laravel Repositories 是一个Laravel包,可以轻松创建和管理存储库。

GitHub release (latest by date) Latest Stable Version Total Downloads Latest Unstable Version License

安装

使用包管理器 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'));
    }
}

存储库钩子

此包为 createupdatedestroyrestore 方法提供了一些钩子。

钩子列表如下

  1. 对于 create 方法,有 beforeCreateafterCreate
  2. 对于 update 方法,有 beforeUpdateafterUpdate
  3. 对于 destroy 方法,有 beforeDestroy
  4. 对于 restore 方法,有 afterRestore
  5. 还有额外的 beforeSaveafterSave 钩子,它们适用于 createupdate 方法。

钩子用法

让我们假设您想在创建或更新用户时对密码进行散列。

// 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 是在调用 createupdate 方法时传递的字段数组。

现在让我们看看另一个稍微复杂一点的例子

假设您在创建用户时提交了一个表单,该表单还有一个名为 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;
}

三个方法 afterSaveafterCreateafterUpdate 都会接收到两个参数 $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;
}

接下来是什么

  1. 编写更多测试

贡献

欢迎提交拉取请求。对于重大更改,请先创建一个问题以讨论您想要更改的内容。

请在提交 PR 之前确保测试。

许可证

MIT