Laravel 5 - 如何使用 $this->app->when()

kta*_*aro 6 php laravel laravel-5.4

阅读有关 Laravel绑定的内容,我明白了$this->app->bind$this->app->singleton因为$this->app->instance它们几乎是相同的。

$this->app->when对我来说有点棘手。

在 Laravel 示例中

$this->app->when('App\Http\Controllers\UserController')
          ->needs('$variableName')
          ->give($value);
Run Code Online (Sandbox Code Playgroud)

根据我的理解,它注入了一些原始值,并且是App\Http\Controllers\UserController将要绑定的对象的别名。但是该对象在哪里?

谁能解释一下吗?感谢您的帮助。

Nam*_*hek 9

上下文绑定不适用于变量名称,但适用于类型。它用于根据上下文为消费类或函数的接口提供不同的实现。事实上,您实际上可以读取方法调用,并且它完全按照您的预期执行。为了详细说明这一点,我将采用文档的示例并对其进行稍微调整:

$this->app->when(Worker::class)
          ->needs(Money::class)
          ->give(function () {
              return new Dollar();
          });

$this->app->when(Boss::class)
          ->needs(Money::class)
          ->give(function () {
              return new Cheque();
          });
Run Code Online (Sandbox Code Playgroud)

在此示例中,Money是一个接口,Dollar也是Cheque该接口的实现。该示例的字面意思是,如果您在类Money上键入hint Worker,它将解析为 while 的实例,Dollar它将解析为类Cheque上的实例Boss。为了说明这一点,这里是实现和结果:

interface Money
{
    public function getAmount();
}

class Dollar implements Money
{
    public function getAmount()
    {
        return 1;
    }
}

class Cheque implements Money
{
    public function getAmount()
    {
        return 100000;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我们输入Money界面来看看我们会得到什么:

class Worker
{
    public function __construct(Money $money)
    {
        echo $money->getAmount(); // prints '1'
    }
}

class Boss
{
    public function __construct(Money $money)
    {
        echo $money->getAmount(); // prints '100000'
    }
}
Run Code Online (Sandbox Code Playgroud)


Sve*_*ort 2

这意味着如果UserController实例化一个类并且它需要一个名为 Larvel 的变量,$variableNameLarvel 将自动使用给定值解析该变量,而您不必提供它。

例如:

$value = "Sven"
$this->app->when('App\Http\Controllers\UserController')
          ->needs('$userName')
          ->give($value);
Run Code Online (Sandbox Code Playgroud)

每当 UserController 需要具有名称的变量时,就会将值“Sven”插入到 UserController 中$userName

换句话说,如果你有像public function __construct(Request $request)Laravel 这样的函数,它就知道要插入什么,因为它知道Request需要一个对象。当您使用像 Laravel 这样的函数时public function __construct($name),不知道要在此处插入什么内容,本质上是您告诉 Laravel 如何使用绑定解析此变量。

这是原始绑定的一个示例,对于上下文绑定,请参阅@Namoshek 的答案