为了账号安全,请及时绑定邮箱和手机立即绑定

Symofny 3 - parent::__construct() 不能被注入

Symofny 3 - parent::__construct() 不能被注入

PHP
弑天下 2021-08-28 15:37:56
我试图将一个服务注入另一个服务以从中调用函数,但它引发了一个错误:类型错误:传递给 App\Base\Service\Shop\ShopService::__construct() 的参数 1 必须是 App\Base\Service\AccountService 的实例,ContainerSgqv3vy\appDevDebugProjectContainer 的实例我认为我正确地实现了一切:use App\Base\Service\AccountService;use App\Base\Service\BaseService;class ShopService extends BaseService{/** * @param AccountService $accountService */public function __construct(AccountService $accountService){    parent::__construct();    $this->accountService = $accountService;}并从中调用我的函数:this->accountService->getMyFunction();我的实例化类:    class BaseService{    /** @var ContainerInterface  */    var $container;    var $em;public function __construct(ContainerInterface $container, EntityManagerInterface $em){    $this->container = $container;    $this->em = $em;}服务.ymlapp.shop:  class: App\Base\Service\ShopService  arguments: ["@service_container", "@doctrine.orm.default_entity_manager"]  public: true
查看完整描述

1 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

当您扩展具有构造函数参数的类时,您应该保留这些参数并在其后添加任何额外的参数。


例子:


class BaseClass

{

    public function __construct(Foo $foo, Bar $bar) {

        // ....

    }

}

要实例化此类,您需要传递容器和实体管理器:


$base = new BaseClass($fooInstance, $barInstance);

如果你想扩展这个类,它很可能仍然需要那些依赖项 + 我们的新依赖项:


class ChildClass extends BaseClass

{

    public function __construct(Foo $foo, Bar $bar, Duck $duck)

    {

        // The parent (BaseClass) requires Foo and Bar, 

        // or it will throw an error

        parent::__construct($foo, $bar);


        $this->duck = $duck;

    }

}

要实例化我们的新 ChildClass,我们需要传递三个参数:


$child = new ChildClass($fooInstance, $barInstance, $duckInstance);

然后,当您在 service.yml 中定义我们的 ChildClass 时,您需要定义所有三个依赖项:


app.childclass:

    class: ChildClass

    arguments: ["Foo", "Bar", "Duck"]

    ...

因为我自己没有使用 Symfony,所以你必须原谅不知道 service.yml 的确切语法,但概念是一样的。


查看完整回答
反对 回复 2021-08-28
  • 1 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信