jigardarji / laravel-repo-pattern
Laravel 仓库模式生成器
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
- Resources
- Repositories
- Test(文件夹)
- TestInterface.php
- TestRepository.php
- RepositoryServiceProvider.php
- Test(文件夹)
- Services
- Test(文件夹)
- Providers
- TestServicesProvider.php
- TestServices.php
- Providers
- Test(文件夹)
将 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