Laravel 5 IoC 类型提示不起作用

Laravel 5 IoC type-hinting not working

据我所知,我应该能够在 class 的构造函数中对我的 class 实例参数进行类型提示,我只在服务提供商的帮助下实例化了它。不幸的是,我收到有关缺少参数的错误。

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?
        });
    }
}

Class API 正在扩展 Tracker,因此使用它的构造函数。为什么在没有隐含的 class 类型提示的情况下无法解析?

没有。 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]);
        });
    }
}

您混淆了 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 关键字自己具体实例化对象时,none 就会发生这种情况。这是一个普通的 PHP 对象实例化。