Связывание с Laravel IoC вместо того, чтобы создавать его снова и снова - PullRequest
0 голосов
/ 12 февраля 2019

В моем приложении есть служба под названием «LogService» для регистрации событий и других элементов.Мне в основном нужно использовать это на каждом контроллере для регистрации событий пользователей.Вместо того, чтобы создавать экземпляр этого сервиса на каждом контроллере, у меня было две мысли для этого.

Вариант 1. Привязать сервис к IoC, а затем разрешить его таким образом.

Вариант 2. Создать мастер-класс с использованием сервиса, а затем расширить его для других классов, чтобы ониуслуга уже привязана

У меня есть вопросы по каждому из этих методов:

Вариант 1: Возможно ли это вообще?Если это так, будет ли это вызываться с помощью App :: make ()?Этот способ, кажется, не слишком хорошо работает с IDE

Вариант 2: я делал подобные вещи в прошлом, но, похоже, PHPStorm не распознает службу из родительского объекта, потому что он создается "App :: make () ", а не с помощью регулярного внедрения зависимостей.

Каков наилучший способ действий?

Спасибо!

1 Ответ

0 голосов
/ 12 февраля 2019

Вы можете сделать это обоими способами, я думаю, что самый подходящий способ будет:

1) Есть интерфейс, который описывает ваш класс, назовем его LogServiceInterface

2) СоздатьПоставщик услуг, который создает экземпляр вашего класса, например:

<?php

 namespace App\Providers;

 use Illuminate\Support\ServiceProvider;

 class LoggerServiceProvider extends ServiceProvider
 {
     /**
      * Register bindings in the container.
      *
      * @return void
      */
     public function register()
     {
         $this->app->bind(LogServiceInterface::class, function($app)
         {
             return new LogService();
         });
     }
  }

3) Зарегистрируйте этого поставщика услуг в config/app.ph файле:

'providers' => [
    // Other Service Providers

    App\Providers\LoggerServiceProvider::class,
],

4) Теперь в контроллере вы можете запроситьэкземпляр чего-то, что прямо в конструкторе реализует LoggerServiceInterface:

(Некоторый контроллер):

<?php namespace App\Http\Controllers;

use Illuminate\Routing\Controller;
use App\Repositories\OrderRepository;

class OrdersController extends Controller {

    /**
     * The logger service.
     * @var LoggerServiceInterface $loggerService
     */
    protected $loggerService;

    /**
     * Create a controller instance.
     *
     * @param  OrderRepository  $orders
     * @return void
     */
    public function __construct(LoggerServiceInterface $loggerService)
    {
        $this->loggerService = $loggerService;
    }

    /**
     * Show all of the orders.
     *
     * @return Response
     */
    public function index()
    {
        // $this->loggerService will be an instance of your LoggerService class that 
        // is instantiated in your service provider
    }

}

Таким образом, у вас есть простой способ быстро изменить реализацию вашего сервисаБолее того, Phpstorm справится с этим очень легко.

Вы по-прежнему сможете использовать app()->make() для получения экземпляра своего сервиса.Это, однако, не будет автоматически подхвачено Phpstorm.Но вы можете помочь ему понять, что все, что вам нужно сделать, это использовать аннотацию @var, см.

/**
 * @var LoggerServiceInterface $logger
 */
 $logger = app()->make(LoggerServiceInterface::class);

That way, Phpstorm will know what to expect from that $logger object.
...