uptoolkit/laravel-repository

有观点的Laravel仓储辅助包

1.0.0 2023-12-07 23:17 UTC

This package is auto-updated.

Last update: 2024-09-08 01:13:26 UTC


README

Scrutinizer Code Quality Build Status Packagist Packagist

使用仓储模式处理业务逻辑的有观点的方式。

此包倾向于为您提供一种有观点的结构来处理一个仓储文件夹内的业务逻辑,而不是在控制器、种子文件等地方复制代码。

它包含了一些便捷的助手函数,让您可以在控制器、API控制器或GraphQL突变中使用此仓储,无需每次都重新定义轮子。

安装

通过composer安装

composer require blok/laravel-repository

用法

Blok repository是Laravel包,将为您的模型和控制提供额外的功能。

创建一个仓储类

php artisan make:repository UserRepository

它将在/app/Repositories/UserRepository中创建一个仓储类

<?php

namespace App\Repositories;

use App\User;
use Blok\Repository\AbstractEloquentRepository;

class UsersRepository extends AbstractEloquentRepository
{
    function model()
    {
        return User::class;
    }
}

不进行任何配置,它将处理基本的CRUD操作

  • all
  • find
  • findBy
  • create
  • update
  • delete
  • getForm
  • 验证

当然,您可以在仓储类内部覆盖这些方法,创建自己的方法

如何在控制器中使用它?

Blok/Repository包含了一个非常便捷且常见的ApiController结构。要使用它,您可以这样做:

php artisan make:apicontroller UserController

它将在/App/Http/Controllers/Api中创建一个ApiController

<?php

namespace App\Http\Controllers\Api;

use App\Repositories\UsersRepository;
use Blok\Repository\Http\Controllers\AbstractApiController;

class UserController extends AbstractApiController
{
    function model()
    {
        return UsersRepository::class;
    }
}

此控制器将直接处理仓储的CRUD逻辑,更多详情请参阅AbstractApiController

如何在GraphQL中使用它?

Blok/Repository包含了一个非常便捷且常见的GraphQL突变结构。它假定您使用https://lighthouse-php.com/来处理Laravel中的GraphQL。

要使用它,您可以这样做:

php artisan make:mutation UserUpdateMutation

它将在/App/Graphql/Mutations中创建一个GraphQL突变

<?php

namespace App\GraphQL\Mutations;

class UserUpdateMutation extends AbstractUpdateMutation
{
    function repository()
    {
        return \App\Repositories\UserRepository::class;
    }
}

此控制器将直接处理创建、更新和删除的CRUD逻辑突变

使用Criteria类添加业务逻辑

当然,可以覆盖AbstractClass中的任何方法,但有时您可能需要在其他地方添加自己的查询逻辑以供重用。为此,我们实现了一种有用的模式,可以帮助您将查询逻辑放在一个可重用的独立类中。

让我们以一个简单的例子来展示get all方法 => 您想获取仅公开的用户。

创建一个Criteria

php artisan make:criteria OnlyPublicCriteria

这将在/app/Repositories/Criterias/OnlyPublicCriteria中创建一个类

<?php

namespace App\Repositories\Criterias;

use Blok\Repository\AbstractCriteria;

class OnlyPublicCriteria extends AbstractCriteria
{
    public $type = "public";

    public function __construct($type = 'public'){
      $this->type = $type;
    }

    public function apply($model, $repository = null)
    {
        return $model->where('visibility', $this->type);
    }
}

在仓储中使用它

在您的UserRepository中,您可以添加并处理您的准则如下:

public function all($columns = array('*'))
{
    if (!auth()->check()) {
        $this->pushCriteria(new OnlyPublicCriteria());
    }

    return parent::all($columns);
}

它将自动将where visibility=public的条件应用于$userRepository->all()方法。

在控制器中使用它

在您的ControllerClass中,您可以注入此参数如下:

<?php

namespace App\Http\Controllers;

use App\Repositories\UserRepository;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * @var UserRepository
     */
    private $userRepository;

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

    /**
     * Display a listing of the resource.
     *
     * @param Request $request
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        if(!auth()->check()){
          $this->userRepository->pushCriteria(new OnlyPublicCriteria('public'));
        }

        $users = $this->userRepository->paginate(12, $request->all());

        return view('users', compact('users'));
    }
}

它将以相同的方式工作,但在控制器级别。当然,您可以在初始化准则时添加自己的变量逻辑(例如,在这里我推入了type public以进行演示)。

将此逻辑放入准则中,将帮助您排队查询条件并在不同的仓储中重用它。

默认提供的准则

您可以在命名空间Blok\Repository\Criterias中找到可用的准则助手。

它们各自包含一个包含您的筛选器的参数,以下是一些关于它们的更多解释:

WhereCriteria

此标准用于筛选来自源模型的数据。对于语法,使用空格分隔元素,可以除BETWEEN(尚未实现)外的所有经典运算符。您还可以使用 AND 和 OR,分别用 && 和 || 表示。

示例

$filters = "first_name = sarah || first_name = mario || first_name LIKE %deb% && email LIKE %gmail% || email LIKE %outlook% && phone != null";

WhereHasCriteria

此标准与WhereCriteria类似,区别在于它是为了筛选与源模型相关的模型元素。对于语法,它与WhereCriteria相同,但您必须在查询开始处和每个 && 之后放置要应用过滤器的关联关系,后面跟着一个 "->"(不带空格)。您可以使用 ||,但它的应用将作用于筛选后的表(使用 "relationshipName->" 选择)。

示例

$filters = "bookings->price_ht > 1000 || price_ht < 100 && socialUsers->provider = google";

安全性

如果您发现任何与安全相关的问题,请通过电子邮件联系我,而不是使用问题跟踪器。

致谢

此软件包在blok/laravel-package-generator的帮助下启动。