簡體   English   中英

在 controller 上注入服務的正確方法

[英]Proper way to inject a service on a controller

我在 Laravel 應用程序中實現存儲庫模式(服務),我對這些服務的接口使用有一些疑問。

我已經創建了一個名為CRUD的接口(代碼如下),作為一種方式來始終為將要實現 CRUD 方法的服務保持相同的名稱。

<?php

namespace App\Interfaces;

interface CRUD
{
  public function create(array $data);
  public function update(int $id, array $data);
  public function delete(string $ids);
};

下面是我如何調用我的服務和服務本身的示例,這就是我的疑慮所在。 通常我會看到人們為每個服務設置一個接口,並要求 controller 注入該類型的對象。 因此,人們必須將特定類型(接口)綁定到 controller。這似乎是多余的,因此我只是通過了我需要的服務。

現在,這樣可以嗎?在這種情況下,我應該將 CRUD 接口傳遞給 controller 嗎? 或者我是否應該專門為每項服務創建另一個接口?

<?php

namespace App\Http\Controllers\Cms;

use App\Http\Controllers\Controller;
use App\Http\Requests\GroupRequest;
use App\Models\Group;
use App\Services\GroupsService;
use Illuminate\Http\Request;

class GroupsController extends Controller
{
  private $service;

  public function __construct(GroupsService $service)
  {
    $this->service = $service;
  }

  public function store(GroupRequest $request)
  {
    $result = $this->service->create($request->all());
    return redirect()->back()->with('response', $result);
  }

  public function update(GroupRequest $request, $id)
  {
    $result = $this->service->update($id, $request->all());
    return redirect()->back()->with('response', $result);
  }

  public function destroy($groups_id)
  {
    $result = $this->service->delete($groups_id);
    return redirect()->back()->with('response', $result);
  }
}
<?php

namespace App\Services;

use App\Models\Group;
use App\Interfaces\CRUD;
use Exception;

class GroupsService implements CRUD
{
  public function listAll()
  {
    return Group::all();
  }

  public function create(array $data)
  {
    $modules_id = array_pop($data);

    $group = Group::create($data);
    $group->modules()->attach($modules_id);

    return cms_response(trans('cms.groups.success_create'));
  }

  public function update(int $id, array $data)
  {
    try {
      $modules_ids = $data['modules'];
      unset($data['modules']);
      $group = $this->__findOrFail($id);

      $group->update($data);
      $group->modules()->sync($modules_ids);

      return cms_response(trans('cms.groups.success_update'));
    } catch (\Throwable $th) {
      return cms_response($th->getMessage(), false, 400);
    }
  }


  public function delete(string $ids)
  {
    Group::whereIn('id', json_decode($ids))->delete();
    return cms_response(trans('cms.groups.success_delete'));
  }

  private function __findOrFail(int $id)
  {
    $group = Group::find($id);
    if ($group instanceof Group) {
      return $group;
    }
    throw new Exception(trans('cms.groups.error_not_found'));
  }
}

如果你想使用存儲庫設計模式,你必須為每個服務創建單獨的接口,以符合 SOLID 原則。 您必須創建自定義服務提供者並注冊您的接口和服務 class,然后在 controller 的構造函數中注入接口。您也可以按照下面的文章進行操作。 https://itnext.io/repository-design-pattern-done-right-in-laravel-d177b5fa75d4

我在 laravel 中使用回購模式做了一些事情 8 你可能會感興趣:

我就是這樣做的:

首先,你需要實現一個提供者

在這個文件中我創建了綁定:

App\ProvidersRepositoryServiceProvider.php

use App\Interfaces\EventStreamRepositoryInterface;
use App\Repositories\EventStreamRepository;
use Illuminate\Support\ServiceProvider;
class RepositoryServiceProvider extends ServiceProvider
{

 public function register()
    {
        $this->app->bind(EventStreamRepositoryInterface::class, EventStreamRepository::class);
    }

}

然后在文件中:

app\Interfaces\EventStreamRepositoryInterface.php

interface EventStreamRepositoryInterface {
    public function index();
    public function create( Request $request );
    public function delete($id);
}

在文件中:

App\Repositories\EventStreamRepository.php

class EventStreamRepository implements EventStreamRepositoryInterface{

public function index()
{
  return EventStream::with(['sessions'])
        ->where([ ["status", "=", 1] ] )
        ->orderBy('created_at', 'DESC')
        ->get();
}


public function create(Request $request)
{
    request()->validate([
        "data1"      => "required",
        "data2"      => "required"
    ]);

    $EventStream = EventStream::create([
        'data1'      => request("data1"),
        'data2'      => request('data2')
    ]);

    return $EventStream->id;
}

public function delete($id)
{
  return EventStream::where('id', $id)->delete();
}

}

在文件中:

應用\Http\Controllers\EventStreamController.php

use App\Interfaces\EventStreamRepositoryInterface;
class EventStreamController extends Controller{

private EventStreamRepositoryInterface $eventStreamRepository;

public function __construct(EventStreamRepositoryInterface $eventStreamRepository)
{
    $this->eventStreamRepository = $eventStreamRepository;
}

 public function index():JsonResponse
{
  $this->eventStreamRepository->index();
}


    public function store(Request $request ):JsonResponse
    {
     $this->eventStreamRepository->create($request);
    }

 public function destroy($id):JsonResponse
    {
        $this->eventStreamRepository->delete($id);   
    }

}//class

注意:我想我刪除了 controller 中所有不必要的-validations--returns-以便更好地閱讀。

希望能幫助到你!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM