【问题标题】:Laravel Dependency Injection with inheritance带有继承的 Laravel 依赖注入
【发布时间】:2015-09-03 15:56:45
【问题描述】:

假设我有以下情况:

<?php

abstract class Service {

    protected $config;

    public function __construct($config)
    {
        $this->config = $config;
    }
}

class ClientService extends Service {

}

class ProductService extends Service {

}

是否可以在我的服务提供者中为我的服务的抽象父类注册依赖注入?

我有一个从规范动态生成的 API,每个类都必须扩展 abstract Service,以便它可以继承基本功能。

当我实例化子服务时,如何在我的抽象服务中注入依赖项?


编辑:这个问题是专门针对抽象类注入提出的,无法绑定自动生成的子类。

【问题讨论】:

    标签: php laravel dependency-injection


    【解决方案1】:

    您可以在这里做两件事。首先,如果$config是一个类,那么你可以在抽象类中输入hint它:

    abstract class Service {
    
        protected $config;
    
        public function __construct(ClassName $config)
        {
            $this->config = $config;
        }
    }
    

    然后每次通过注入或调用App::make('ClientService') 解决子类时,都会注入配置类。

    如果配置不是类并且不能进行类型提示,则必须将子类单独绑定到容器中:

    App::bind('ClientService', function () {
        // Get $config from somewhere first
    
        return new ClientService($config);
    });
    
    App::bind('ProductService', function () {
        // Get $config from somewhere first
    
        return new ProductService($config);
    });
    

    然后您就可以致电App::make('ClientService') 或通过 DI 解决问题。

    【讨论】:

    • 确实我想过这个,但我想避免,因为服务类是从具有 cron 任务的规范生成的,所以(它不应该发生,但谁知道)可以添加一些类而且我必须手动更新我的服务提供商
    • 当然这仍然不会阻止第一个选项的工作?
    • 当然,我想这就是我要做的,我会选择另一个答案,因为它在你之前回答了我的问题
    【解决方案2】:

    在您的示例中,每次从 Service 类或子类实例化时,您都必须手动传递 config 对象。

    所以当你想直接实例化一个子服务时,你可以使用$cs = new ClientService(new Config());

    但是,您可以使用 DI 的真正优势(因为您使用的是 Laravel),方法是在构造函数中输入类名,如下所示。

    public function __construct(\Config $config)
    

    这样,如果你在实例化时不传递参数,它会默认创建一个类型提示类的对象并注入它。所以你可以像这样使用它。

    $cs = new ClientService();

    这会将 Laravel Config 实例注入到 ClientService 对象中。

    【讨论】:

    • 好的,所以我没有真正的方法在抽象类中注入一些更具体的代码?在这种情况下,我必须坚持使用 laravel 的自动 DI 吗?
    • 是的,但好消息是,如果您在其他地方使用此类,您可以选择手动传递您可能拥有的任何 config 实例。你总是可以ClientService(new SomeOtherConfig());
    猜你喜欢
    • 2021-11-05
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    相关资源
    最近更新 更多