Laravel 5 IoC type hinting не работает

Насколько я понял, я должен иметь возможность набирать подсказки моего экземпляра класса в конструкторе моего класса, который я создаю только с помощью поставщика услуг. К сожалению, я получаю ошибку об отсутствующих аргументах.

Tracker.php

function __construct($query, Tracker\Shipment $shipment) {
$this->query    = $query;
$this->shipment = $shipment;
}

TrackerServiceProvider.php

class TrackerServiceProvider extends \Illuminate\Support\ServiceProvider {
public function register() {
$this->app->bind('TrackerAPI',  function($app, $shipment_number) {
return new Tracker\API($shipment_number); // omitting Shipment argument should resolve on its own?
});
}
}

Класс API расширяет Tracker, используя его конструктор. Почему не разрешается без подсказки о типе класса?

5

Решение

Вы перепутали PHP new функциональность с внедрением зависимостей Laravel через подсказки типа.

В вашем TrackerAPI обязательный, когда вы указываете return new Tracker\API($shipment_number);нет ничего встроенного в PHP, чтобы попытаться найти пропущенные параметры. Для этого вам необходимо return $app->make('Tracker\API', [$shipment_number]);

Когда вы используете App::make() метод, Laravel сделает свое волшебство, чтобы создать новый объект. Сначала проверяется явно определенная привязка. Если он не находит явную привязку, он просто использует комбинацию предоставленных параметров плюс подсказки типов для создания объектов для любых отсутствующих параметров.

Примите следующее утверждение: App::make('Tracker\API', [$shipment_number]), Предположим, что не существует явно определенной привязки для Tracker\API, Tracker\API Конструктор требует двух параметров. $shipment_number передается в массив параметров, поэтому он будет использоваться в качестве первого параметра. Поскольку был предоставлен только один параметр, Laravel будет App::make() остальные параметры используют подсказки типа.

Однако, когда вы специально создаете экземпляр объекта, используя new Ключевое слово, ничего этого не происходит. Это простая реализация объекта PHP.

7

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

Нету. Laravel не может разрешить такие частичные вопросы. Вы должны быть явными:

use Tracker\API;
use Tracker\Shipment;
use Illuminate\Support\ServiceProvider;

class TrackerServiceProvider extends ServiceProvider {

public function register()
{
$this->app->bind('TrackerAPI',  function($app, $shipment_number)
{
return new API($shipment_number, $app[Shipment::class]);
});
}
}
1

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