Symofny 3-不能注入parent :: __ construct()

时间:2019-06-19 13:07:36

标签: php service symfony-3.4

我试图将一项服务注入另一项服务以从中调用函数,但是会引发错误:

  

类型错误:传递给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;
}

service.yml

app.shop:
  class: App\Base\Service\ShopService
  arguments: ["@service_container", "@doctrine.orm.default_entity_manager"]
  public: true

1 个答案:

答案 0 :(得分:0)

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

示例:

Y

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

class BaseClass
{
    public function __construct(Foo $foo, Bar $bar) {
        // ....
    }
}

如果要扩展此类,则很可能仍需要那些依赖项+我们的新依赖项:

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

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

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;
    }
}

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

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

由于我本人不是在使用Symfony,您必须为不知道service.yml的确切语法找借口,但是概念是相同的。