Laravel - разрешить класс с зависимостями и выполнить конструктор экземпляра класса - PullRequest
1 голос
/ 05 марта 2020

Рассмотрим этот код:

<?php namespace App\Services;

use App\Services\AnotherService;

class SomeService {
    public function someMethod() {
        $anotherService = \App::make(AnotherService::class);
    }
}

Что я собираюсь сделать - получить объект класса со всеми его зависимостями. Но в этом конкретном случае c мне бы хотелось, чтобы __construct объекта также был выполнен. Я пытался и с помощью кода выше, метод __construct объекта $ anotherService не выполняется.

Поэтому я могу достичь того, что мне нужно, с помощью -

$anotherService = \App::make(AnotherService::class);
$anotherService->__construct();

Так у меня вопрос - можно ли это сделать с помощью одной строки вместо избыточного каждый раз при вызове метода конструкции после создания экземпляра объекта? - Потому что для этого и создан метод __construct - выполняется автоматически. Но я заметил, что по какой-то причине автоматическое c разрешение зависимостей Laravel пропускает выполнение __construct.

Обратите внимание, что new AnotherService() для меня не вариант, так же как и использование __construct метод SomeService класса. Я хотел бы сделать объект внутри метода someMethod.

Обновление:

Класс AnotherService в настоящее время не имеет каких-либо зависимостей. В __construct есть только некоторые случайные обновления переменных, например:

public function __construct() {
    $this->varA = true;
    $this->varB = 'Some Value';
}

Почему мне нужно разрешить этот класс (вместо использования new AnotherClass())? - Просто потому, что я хочу проверить этот вызов в модульных тестах, издеваясь над ним. Для этого я использую этот код:

$this->mock(AnotherService::class, function ($mock) {
    $mock->shouldReceive('anotherMethod')->andReturn(false);
});

И, наконец, мне нужно вызвать метод для проверки ответа:

$anotherService = \App::make(AnotherService::class);//<-- In this moment $varA and $varB are not set because the __construct did not execute!
$response = $anotherService->anotherMethod();

// Assert...

Итак, в этом случае, например, если anotherMethod будет использовать любую из этих переменных, тесты будут некорректными, поскольку их значения не установлены.

...