如何使用构造函数注入的服务

时间:2016-05-25 20:05:24

标签: php symfony dependency-injection

我有一些逻辑类作为服务实现。他们做了类似的事情,所以我想设置一个层次结构:

namespace \Company\Bundle\Service;

abstract class ParentLogic {
    protected $user;
    public function __construct($security_token_storage) {
        $this->user = $security_token_storage->getToken()->getUser();
    }
}

class ChildLogic extends ParentLogic {
}

以下是我如何设置服务

services:
    parentlogic:
        abstract: true
        class: Company\Bundle\Service\ParentLogic
        arguments: [@security.token_storage]
    childlogic:
        class: Company\Bundle\Service\ChildLogic
        parent: parentlogic

然而,当我尝试在控制器中使用childlogic服务时

namespace Company\Bundle\Controller;

class TestController {
    static public function getLogicService() {
        return $this->get('childlogic');
    }
}

我收到一条错误,说缺少构造函数的参数:

  

警告:缺少公司\ Bundle \ Service \ parentlogic :: __ construct()的参数1,在2220行的/file/path/to/company/app/cache/dev/classes.php中调用并定义

这可能吗?如果是这样,我做错了什么,或者更好的是如何正确完成?

1 个答案:

答案 0 :(得分:0)

塞拉德在评论中所说的可能是真的。父服务上不使用构造函数参数。我们有一个类似的控制器设置,我们有一个AbstractController作为父服务和具体的控制器继承自AbstractController。但是在我们的服务定义中,我们使用setter-calls将任何依赖项添加到父级:

services:
    abstract_controller:
        class: Bundle\Controller\AbstractController
        abstract: true
        calls:
            - [setSomething, ['@something']]
            - [setAnotherThing, ['@anotherThing']]
    concrete_controller:
        class: Bundle\Controller\ConcreteController
        parent: abstract_controller

像魅力一样。

我认为如果你想使用构造函数参数,你应该在你的子服务定义中明确指定它们,因为在创建子服务时,将调用父构造函数。