Рассмотрим этот код:
<?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
будет использовать любую из этих переменных, тесты будут некорректными, поскольку их значения не установлены.