surazdott/laravel-repository

Laravel 仓库设计模式,包含服务和接口。

v1.0.1 2024-04-26 09:59 UTC

This package is auto-updated.

Last update: 2024-09-26 12:22:48 UTC


README

介绍

Laravel 仓库设计模式包提供了一种概述,用于Laravel服务和仓库结构中使用的设计模式。此模式的主要目标是分离关注点、改进代码组织并提高可维护性。

仓库模式组件

  • 服务层:此层包含应用程序的业务逻辑。它将应用程序的功能从控制器中抽象出来,促进更好的关注点分离。

  • 仓库层:仓库作为与数据库交互的接口。它从服务层抽象数据库操作,使得在不影响业务逻辑的情况下轻松切换到不同的数据源变得容易。

开始使用

需要 PHP 8.1+

首先,使用Composer包管理器安装包

composer require surazdott/laravel-repository

生成类

您也可以单独生成仓库类,或使用选项生成。

基本命令

// Generate repository class
php artisan make:repository UserRepository

// Generate repository with service
php artisan make:repository UserRepository --service

// Generate repository with interface
php artisan make:repository UserRepository --interface

// Generate repository with interface and service
php artisan make:repository UserRepository --all

// Generate service class
php artisan make:repository-service UserService

// Generate interface class
php artisan make:repository-interface UserRepositoryInterface

要查找帮助和选项

php artisan make:repository --help

基本用法

随着软件开发行业的不断演变,人们越来越关注提高代码的可维护性,这导致了设计模式的修改。

基类

  • use SurazDott\Repositories\BaseRepository;
  • use SurazDott\Services\BaseService;

让我们看看一个简单的例子

仓库接口

首先创建您的初始仓库接口。

php artsian make:repository-interface UserRepositoryInterface

App\Repositories\Interfaces\UserRepositoryInterface.php

<?php

namespace App\Repositories\Interfaces;

use Illuminate\Database\Eloquent\Model;

interface UserRepositoryInterface
{
    /**
     * Find database record by id.
     *
     * @param  mixed  $id
     */
    public function findById(string $id): ?Model;
}

仓库类

使用以下命令创建您的第一个仓库类。

php artisan make:repository UserRepository

App\Repositories\UserRepository.php

<?php

namespace App\Repositories;

use App\Models\User;
use App\Repositories\Interfaces\UserRepositoryInterface;
use Illuminate\Database\Eloquent\Model;
use SurazDott\Repositories\BaseRepository;

class UserRepository extends BaseRepository implements UserRepositoryInterface
{
    /**
     * Create new repository instance.
     */
    public function __construct(
        protected User $model
    ) {
    }

    /**
     * Find database record by id.
     */
    public function findById(string $id): ?Model
    {
        return $this->model->find($id);
    }
}

服务类

在接口和仓库之后,使用以下命令创建服务类。

php artisan make:repository-service UserService

App\Service\UserService.php

<?php

namespace App\Services;

use App\Repositories\UserRepository;
use Illuminate\Support\Collection;
use Illuminate\Database\Eloquent\Model;
use SurazDott\Services\BaseService;

class UserService extends BaseService
{
    /**
     * Create new service instance.
     */
    public function __construct(
        protected UserRepository $repository
    ) {
    }

    /**
     * Find database record by id.
     *
     * @param  string  $id
     */
    public function findById($id): ?Model
    {
        return $this->repository->findById($id);
    }
}

控制器类

现在创建一个Laravel控制器文件,并如下使用服务类。

php artsian make:controller UserController

App\Http\Controllers\UserController.php

<?php

namespace App\Http\Controllers;

use App\Services\UserService;
use Illuminate\View\View;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Create a new controller instance.
     */
    public function __construct(
        private UserService $users
    ) {
    }

    /**
     * Display a listing of the resource.
     */
    public function edit(Request $request): View
    {
        $data['user'] = $this->users->findById($id);

        return view('admin.users.edit', $data);
    }
}

Eloquent 查询构建器

如果您想运行Eloquent查询,您可以调用query()函数来获取Eloquent构建器。例如:$this->users->query()->latest()->get();

<?php

namespace App\Http\Controllers;

use App\Services\UserService;
use Illuminate\View\View;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Create a new controller instance.
     */
    public function __construct(
        private UserService $users
    ) {
    }

    /**
     * Display a listing of the resource.
     */
    public function index(): View
    {   
        // get all users
        $data['users'] = $this->users->query()->latest()->get();

        // get active users
        $data['activeUsers'] = $this->users->query()->where('status', true)->get();

        return view('admin.users.index', $data);
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(Request $request): View
    {
        $data['user'] = $this->users->findById($id);

        return view('admin.users.edit', $data);
    }
}

方法

查看以下列表中的一些方法。

create()

要将新记录插入到数据库中,您应使用create方法。

$data = $request->validated();
$this->userService->create(array $data);

find()

要从数据库记录中获取第一条记录,您应使用find方法。

$this->userService->find(string $id);

first()

要从数据库记录中获取第一条记录,您应使用first方法。

$this->userService->first(string $id);

findOrFail()

要从数据库记录中查找特定记录,您应使用findOrFail方法。

$this->userService->findOrFail(string $id);

update()

要从数据库记录中查找特定记录,您应使用update方法。

$data = $request->validated();
$this->userService->update(string $id, array $data);

delete()

要从数据库中删除记录,您应使用delete方法并传递整数、数组或字符串。

$this->userService->delete(mixed $ids);

query()

您可以使用query方法构建数据库构建器,并运行Eloquent查询和模型作用域。

$this->userService->query();

贡献

如果您发现任何问题或对改进有建议,请随时打开问题或创建pull请求。欢迎贡献!

许可证

此包是开源软件,许可协议为MIT许可证