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将要绑定的对象的别名。但是该对象在哪里?
谁能解释一下吗?感谢您的帮助。
上下文绑定不适用于变量名称,但适用于类型。它用于根据上下文为消费类或函数的接口提供不同的实现。事实上,您实际上可以读取方法调用,并且它完全按照您的预期执行。为了详细说明这一点,我将采用文档的示例并对其进行稍微调整:
$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)
这意味着如果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 的答案