Насколько я понял, я должен иметь возможность набирать подсказки моего экземпляра класса в конструкторе моего класса, который я создаю только с помощью поставщика услуг. К сожалению, я получаю ошибку об отсутствующих аргументах.
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, используя его конструктор. Почему не разрешается без подсказки о типе класса?
Вы перепутали 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.
Нету. 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]);
});
}
}