jigardarji/laravel-repo-pattern

Laravel 仓库模式生成器

dev-master 2023-12-25 05:42 UTC

This package is auto-updated.

Last update: 2024-09-25 07:07:29 UTC


README

Laravel 仓库模式是一个用于编写结构化代码的包。它帮助您在服务中分离逻辑并将数据库相关查询调用到仓库中。这将帮助您组织逻辑代码和查询,并使其更容易维护。

如何安装

使用 Composer 安装 Laravel 仓库模式包

composer require jigardarji/laravel-repo-pattern

使用以下命令生成仓库模式文件

php artisan make:repo_structure {名称}

例如:php artisan make:repo_structure Test

它将生成以下文件

  • Http
    • Resources
      • BaseResource.php
  • Repositories
    • Test(文件夹)
      • TestInterface.php
      • TestRepository.php
    • RepositoryServiceProvider.php
  • Services
    • Test(文件夹)
      • Providers
        • TestServicesProvider.php
      • TestServices.php

将 RepositoryServiceProvider.php 和 TestServicesProvider.php 注册到 config/app.php 的 provider 部分

'providers' => [
....
App\Repositories\RepositoryServiceProvider.php
App\Services\Test\Providers\TestServicesProvider.php
],

注册这两个文件后,使用 __construct 方法将服务文件包含到控制器中。

TestController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Services\Test\TestServices;

class TestController extends Controller
{
    public $testServices;

    public function __construct(TestServices $testServices)
    {
        $this->testServices = $testServices;
    }

    public function index()
    {
        $data = $this->testServices->index();
        return json_decode($data);
    }
}

TestService.php

<?php

namespace App\Services\Test;

use App\Repositories\Test\TestInterface;

class TestServices
{
    private $testRepo;

    public function __construct(TestInterface $testRepo)
    {
        $this->testRepo = $testRepo;
    }

    public function index(array $params)
    {
        /**
         * Business logic
         */
        return $this->testRepo->getData();
    }
}

TestInterface.php

定义所有您想要创建的方法,并在仓库文件中实现所有定义的方法。

<?php

namespace App\Repositories\Test;

interface TestInterface
{
    public function index(array $fields);
}

TestRepository.php

在 TestRepository 文件中,您需要在构造方法中定义模型,并将查询写入不同的方法中。

<?php

namespace App\Repositories\Test;

use App\Models\Test;
use App\Repositories\Test\TestInterface;

class TestRepository implements TestInterface
{

    private $test;

    public function __construct(Test $test)
    {
        $this->test = $test;
    }

    public function index(array $field)
    {
        return $this->test->select('id', 'name')->get();
    }
}

如果您在构造方法中添加了另一个模型,您必须也在 RepositoryServiceProvider.php 中定义该模型;如果您为另一个模块创建了另一个结构,您必须将代码添加到 RepositoryServiceProvider.php 中。

RepositoryServiceProvider.php

<?php

namespace App\Repositories;

use Illuminate\Support\ServiceProvider;
use App\Repositories\Test\TestInterface;
use App\Repositories\Test\TestRepository;
use Illuminate\Contracts\Support\DeferrableProvider;

class RepositoryServiceProvider extends ServiceProvider implements DeferrableProvider
{
    public function register()
    {
        $this->registerTestRepository();
        // create new function below and define here for new module
    }

    protected function registerTestRepository()
    {
        $this->app->bind(TestInterface::class, function () {
            return new TestRepository(new Test(),'add new model as per repository file');
        });
    }

    public function provides()
    {
        return [
            TestInterface::class,
            // add new interface which you created and define above
        ];
    }
}

BaseResource.php

如果您正在制作 API,可以使用此文件以良好格式发送 API 的响应。您需要在控制器中使用它来从控制器返回成功或错误响应。

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class BaseResource extends JsonResource
{

    public function success($data, $code = 200)
    {
        $response =  [
            'status' => 'success',
            'data' => $data,
            'errors' => null
        ];
        return response()->json($response, $code);
    }

    public function error($messages, $code = 500)
    {
        $response = [
            'status' => 'error',
            'data' => null,
            'errors' => $messages
        ];
        if (!empty($messages)) {
            $response['errors'] = $messages;
        } else {
            $response['errors'] = 'Something went wrong!';
        }
        return response()->json($response, $code);
    }
}

如果您遇到任何错误,可以使用以下命令修复

composer dump-autoload