alterindonesia/service-pattern

v0.0.45 2024-08-03 15:21 UTC

README

此包为Laravel应用程序提供服务模式。此包使用MVC的默认概念,但增加了服务层。我们不会更改Laravel功能(如请求、资源等)的默认逻辑。此包的层次如下:

  1. 请求从路由通过FormRequest Laravel发送到控制器。
  2. 在控制器中,根据FormRequest实例进行验证。
  3. 验证成功后,控制器通过Laravel Service Provider的绑定功能调用服务层。
  4. 服务层将处理业务逻辑并将结果返回给控制器。
  5. 控制器将通过资源将结果返回给客户端。
  6. 资源将格式化结果发送给客户端。

安装

composer require alterindonesia/service-pattern

使用

  1. 更新app/Http/Controllers文件夹中的Controller.php文件。
<?php

namespace App\Http\Controllers;

use Alterindonesia\ServicePattern\Controllers\BaseController;

abstract class Controller extends BaseController
{

}
  1. 您的控制器应该如下所示
<?php

namespace App\Http\Controllers;

use Alterindonesia\ServicePattern\Contracts\IServiceEloquent;
use App\Http\Requests\TestRequest;
use App\Http\Resources\TestResource;

class TestController extends Controller
{
    public function __construct(
        IServiceEloquent $service,
        string $request = TestRequest::class,
        string $response = TestResource::class
    ) {
        parent::__construct($service, $request, $response);
    }
}

您可以根据需要更改请求和响应。

  1. 在app/Services文件夹中创建您的服务。
  2. 通过 artisan 命令创建服务
php artisan make:service TestService --model=Test
  1. 您的服务应该如下所示
<?php
namespace App\Services;
use Alterindonesia\ServicePattern\ServiceEloquents\BaseServiceEloquent;
use App\Models\Test;

class TestServiceEloquent extends BaseServiceEloquent
{
    public function __construct(
        Test $model
    ) {
        parent::__construct($model);
    }

}
  1. 它将自动生成CRUD操作,您可以根据需要覆盖方法。
  2. 您的路由应该如下所示
<?php
use Illuminate\Support\Facades\Route;

Route::get('/test','App\Http\Controllers\TestController@index');
Route::post('/test','App\Http\Controllers\TestController@store');
Route::get('/test/{id}','App\Http\Controllers\TestController@show');
Route::put('/test/{id}','App\Http\Controllers\TestController@update');
Route::delete('/test/{id}','App\Http\Controllers\TestController@destroy');
  1. 现在,在AppServiceProvider.php中将服务绑定
<?php

namespace App\Providers;

use Alterindonesia\ServicePattern\Contracts\IServiceEloquent;
use App\Http\Controllers\TestController;
use App\Services\TestServiceEloquent;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        //
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        $this->app->when(TestController::class)
            ->needs(IServiceEloquent::class)
            ->give(TestServiceEloquent::class);

    }
}
  1. 完成,现在您可以在Laravel应用程序中使用此包了。

常见问题解答

  • 为什么你没有使用RepositoryLayer?
    • 我个人认为,Repository Layer不是必要的,因为Laravel Eloquent已经非常强大。
    • 但是,如果您想的话,您可以在服务层中创建自己的Repository Layer。

下一个功能

  • 为查询构建器添加服务层
  • 添加Yajra Datatables服务层
  • 为导入/导出添加服务层
  • 我们正在考虑