Symofny 3 - parent :: __ construct () не может быть введен - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь внедрить один сервис в другой, чтобы вызвать функцию из него, но выдает ошибку:

Ошибка типа: Аргумент 1 передан в App \ Base \ Service \ Shop \ ShopService ::__construct () должен быть экземпляром 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 голосов
/ 19 июня 2019

Когда вы расширяете класс, имеющий аргументы конструктора, вы должны сохранить эти аргументы и добавить любой дополнительный аргумент после.

Пример:

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

Затем, когда вы определяете наш ChildClass в service.yml, вам необходимо определить все три зависимости:

app.childclass:
    class: ChildClass
    arguments: ["Foo", "Bar", "Duck"]
    ...

Поскольку я сам не использую Symfony, вы должны извиниться за то, что не знаете точный синтаксис service.yml, но концепция та же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...