Задать вопрос
@kirill-93

Laravel как зарегистрировать свой service?

Прочел вот эту статью https://laravel-news.ru/blog/tutorials/design-patt...
В ней описывается использование паттерна Service Layer.
Все сводится к тому, чтобы создать директорию app/Services а в ней класс Сервиса и обращаться к нему в контроллере.
Как его подключить, чтоб он был доступен в контроллере, не сказано. Пытался повторить пример из статьи, получаю ошибку Undefined property: App\Http\Controllers\HomeController::$createCouponService
Я так понимаю, новый сервис нужно как-то подключить?
  • Вопрос задан
  • 1677 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
miraage
@miraage
Старый прогер
Read The Following Manual.

// app/providers/AppServiceProvider.php

use App\Services\Coupon\CreateCoupon;
use App\Services\Notification;

class AppServiceProvider
{
  public function register()
  {
    // for regular services
    $this->app->bind(CreateCoupon::class);

    // for singletons
    $this->app->singleton(Notification::class);
  }
}

// app/http/controllers/CouponController

use App\Services\Coupon\CreateCoupon;

class CouponController
{
  public function create(Request $request, CreateCoupon $service)
  {
    $service->create($request->input());
  }
}


// EDIT

Доп ответ для Станислав Почепко

Вот я в данный момент пишу сервис. И есть такой вопрос. Если у меня сервис зависит от объекта? Я его передаю в construct в сервис. Как в данном случае его подключать в контроллере?
И насколько плохо, если внутри сервиса используется другой сервис? Это грубое нарушение слоёв?


Полная свобода действий, однако не переборщите.

1) использование вспомогательного (читай - приватного) сервиса, который нужен только этому классу
namespace App\Services\Insurance\Ally;

use App\Contracts\InsuranceProvider;

class Provider implements InsuranceProvider
{
  public function __construct()
  {
    // Api === App\Services\Insurance\Ally\Api, совпадает namespace
    // Сервис Api нужен исключительно этому провайдеру
    $this->api = new Api();
  }

  public function getTerms($invoice)
  {
    // получаем данные с api и отдаем их
    return $this->api->getTerms($invoice);
  }
}


2) использование и
namespace App\Services\FormBuilder;

// AppServiceProvider::register()
// $this->app->bind(HtmlRenderer::class);
use App\Services\Renderer\HtmlRenderer;

class Builder
{
  public function __construct(HtmlRenderer $renderer)
  {
    $this->inputFactory = new InputFactory();
    $this->renderer = $renderer;
    $this->inputs = [];
  }

  public function addInput($type, $className, $placeholder)
  {
    $this->inputs[] = $this->inputFactory->create($type, $className, $placeholder);
  }

  public function render()
  {
    return $this->renderer->render($this->inputs);
  }
}


3) service factory
// appserviceprovider
use App\Contracts\Renderer;

public function register()
{
  $this->app->register(Renderer::class, function ($params) {
    switch ($params['type']) {
      case 'html':
        return new HtmlRenderer();
      case 'xml':
        return new XmlRenderer();
    }
  });
}

// some service
use App\Contracts\Renderer;

class FormBuilder
{
   public function __construct($rendererType)
  {
    $this->renderer = app()->make(Renderer::class, ['type' => $rendererType]);
  }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
DJZT
@DJZT
Laravel - code for you
Вы неймспейс правильно указали?
Вы должны обращаться так
new App\Services\MyService()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы