如何正确使用Laravel Service Container?

How to properly use Laravel Service Container?

好的,我已经看过有关该主题的 Laracast 视频,也已经阅读了文档,但我仍然错过了这里的核心点。假设我们有以下结构:

于是我明白了如何创建一个服务提供者,绑定一个class到服务容器,稍后解析。但是,如果 MyCustomClass 绑定必须替换为 \App\SomeOtherClass 怎么办?如果我不引用它,那将导致缺少 SomeOtherClass 的异常。这让我想到了一个问题:“使用服务容器有什么意义,因为我仍然必须再次引用绑定 class?我在这里做错了什么?

绑定到一个 interface/contract,两个可交换 classes 都符合。

interface CustomInterface
{
    public function greeting();
}

class FirstCustomClass implements CustomInterface
{
    public function greeting()
    {
        return 'hello world';
    }
}

class SecondCustomClass implements CustomInterface
{
    public function greeting()
    {
        return 'hello world two';
    }
}

然后在您的服务提供商中绑定到 Namespace\Of\My\Interface\CustomInterface:class 然后 return 您想要的任何实现。

在你的控制器内部,你应该依赖注入你的接口,然后它最终会给你默认的 class。

这意味着您可以快速将 class 替换为具有相同界面的另一个,或者在测试时轻松模拟它。