我有一些逻辑类作为服务实现。他们做了类似的事情,所以我想设置一个层次结构:
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中调用并定义
这可能吗?如果是这样,我做错了什么,或者更好的是如何正确完成?
答案 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
像魅力一样。
我认为如果你想使用构造函数参数,你应该在你的子服务定义中明确指定它们,因为在创建子服务时,将调用父构造函数。