Связывание с Laravel IoC вместо того, чтобы создавать его снова и снова

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

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

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

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

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

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

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

Спасибо!

1

Решение

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

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.
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]