Php Laravel'的用途和目的是什么;有约束力吗?

Php Laravel'的用途和目的是什么;有约束力吗?,php,laravel,Php,Laravel,我一点也不懂拉威尔的束缚系统。我知道依赖注入是什么意思。即使没有那种奇怪的“绑定”,它也可以工作,对吗?我在文档中看到,绑定可以返回一个新对象。为什么以及何时我必须使用它?请解释一下,不要太复杂,因为我已经阅读了文档,无法理解绑定的用途和目的。谢谢 即使没有那种奇怪的“绑定”,它也可以工作,对吗 不是真的。当然,如果所需的依赖项很容易实例化,那么它就可以正常工作。假设您将这个简单的类Foo存储在app目录中: <?php namespace App; class Foo { p

我一点也不懂拉威尔的束缚系统。我知道依赖注入是什么意思。即使没有那种奇怪的“绑定”,它也可以工作,对吗?我在文档中看到,绑定可以返回一个新对象。为什么以及何时我必须使用它?请解释一下,不要太复杂,因为我已经阅读了文档,无法理解绑定的用途和目的。谢谢

即使没有那种奇怪的“绑定”,它也可以工作,对吗

不是真的。当然,如果所需的依赖项很容易实例化,那么它就可以正常工作。假设您将这个简单的类
Foo
存储在
app
目录中:

<?php

namespace App;

class Foo
{
    public function hello()
    {
        return 'Hello World';
    }
}
我们甚至可以更进一步,假设这个
Foo
类需要另一个简单的类
Bar
。我们的
Bar
类如下所示:

<?php

namespace App;

class Bar
{
    public function hello()
    {
        return 'bar';
    }
}
Laravel现在能解析提示的
Foo
类类型吗?对拉威尔仍然能够解决这个
Foo

<?php

namespace App;

class PaypalProcessor implements PaymentProcessorInterface
{
    public function pay()
    {
        return 'pay with paypal';
    }
}
现在,当我们的
Foo
类需要配置稍微复杂的依赖项时,问题就会出现。假设我们的
Foo
类只需要应用程序的名称。当然,您可以在类的方法中简单地使用
config('app.name')
,但是想象一下,这可能是一个需要配置数组来实例化的HTTP客户机

<?php

namespace App;

class Foo
{
    public function __construct($appName)
    {
        $this->appName = $appName;
    }

    public function hello()
    {
        return "Hello {$this->appName}";
    }
}
有时,您不希望创建多个实例。例如,像我们的
Foo
类一样,这种类不需要多个实例。在这种情况下,我们可以用singleton方法绑定它

$this->app->singleton(\App\Foo::class, function ($app) {
    return new \App\Foo($app->config['app.name']);
});
更重要的用法

但是这个服务容器更重要的用途是我们可以将一个接口绑定到它的实现。假设我们使用
paymentprocessor接口
pay
方法:

<?php

namespace App;

interface PaymentProcessorInterface
{
    public function pay();
}
使用服务容器,我们可以将
PaymentProcessorInterface
绑定到
StripeProcessor
类:

$this->app->bind(\App\PaymentProcessorInterface::class, function () {
    return new \App\StripeProcessor();
});
然后,我们可以在代码中键入提示的
PaymentProcessorInterface

Route::get('/pay', function (App\PaymentProcessorInterface $paymentProcessor) {
    return $paymentProcessor->pay(); // pay with stripe
});
通过这种方式,我们可以轻松地交换
PaymentProcessorInterface
实现。假设我们想将支付处理器更改为Paypal,那么我们就有了这个
PaypalProcessor

<?php

namespace App;

class PaypalProcessor implements PaymentProcessorInterface
{
    public function pay()
    {
        return 'pay with paypal';
    }
}

希望这能给你一些想法。

阅读这篇文章,非常感谢你提供了详细的图坦卡蒙:)官方文件应该会给像你这样的人写信。明亮的完美的拍手:太棒了,太棒了!
$this->app->bind(\App\PaymentProcessorInterface::class, function () {
    return new \App\StripeProcessor();
});
Route::get('/pay', function (App\PaymentProcessorInterface $paymentProcessor) {
    return $paymentProcessor->pay(); // pay with stripe
});
<?php

namespace App;

class PaypalProcessor implements PaymentProcessorInterface
{
    public function pay()
    {
        return 'pay with paypal';
    }
}
$this->app->bind(\App\PaymentProcessorInterface::class, function () {
    return new \App\PaypalProcessor();
});