Symofny 3 - parent::__construct() не может быть введен

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

Type error: Argument 1 passed to App\Base\Service\Shop\ShopService::__construct() must be an instance of App\Base\Service\AccountService, instance of ContainerSgqv3vy\appDevDebugProjectContainer given

И я думаю, что реализую все правильно:

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

Где вы создаете экземпляр этого класса?

Andrei Lupuleasa 19.06.2019 15:10

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

M. Eriksson 19.06.2019 15:17

Я создаю экземпляр существующего класса службы AccountService. Я не знаю, где проблема. Можете показать на примере? @МагнусЭрикссон

Tommy J 19.06.2019 15:33

Я создаю экземпляр существующего класса службы AccountService. Я не знаю, где проблема. Можете показать на примере? @AndreiLupuleasa

Tommy J 19.06.2019 15:34

Покажите нам все соответствующий код. Прямо сейчас мы даже не знаем, какой класс вы опубликовали. Мы можем видеть конструктор и то, что он ожидает экземпляр AccountService в конструкторе, но это все. Нам нужно увидеть, где вы создаете экземпляр опубликованного класса (поскольку именно здесь находится ваша проблема).

M. Eriksson 19.06.2019 15:37

Извините, ShopService на самом деле является MainService, поскольку я редактировал свой код. Я обновил это сейчас. Спасибо @MagnusEriksson

Tommy J 19.06.2019 15:50

Не волнуйтесь. Но вы все еще не опубликовали, где вы создаете экземпляр этого класса.

M. Eriksson 19.06.2019 15:51

Я не так хорош с английским, поэтому я не знаю, что это означает. Я опубликовал логику, с которой работаю. @МагнусЭрикссон

Tommy J 19.06.2019 15:53

Инстанцируйте, создайте новый экземпляр класса. Это должен быть либо new ShopService(....), либо определенный в каком-либо поставщике услуг или аналогичный (я не работал с фреймворком Symfony, поэтому я не уверен, где вы регистрируете классы в контейнере).

M. Eriksson 19.06.2019 15:54

Возможно, вы думаете о service.yml. Я добавил код выше. @МагнусЭрикссон

Tommy J 19.06.2019 15:59
arguments: ["@service_container", "@doctrine.orm.default_entity_manager"] - Вероятно, первым аргументом должно быть AccountService, а не контейнер. Кроме того, вам, похоже, не нужен второй аргумент (смотря на конструктор класса, он ожидает только один аргумент).
M. Eriksson 19.06.2019 16:10

Эти два аргумента являются аргументами расширенного класса BaseService, который я ввел выше. у него есть $container и $em varibale. Итак, parent::__construct() отсутствует. @МагнусЭрикссон

Tommy J 19.06.2019 16:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
12
236
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Пример:

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

Чтобы создать экземпляр нашего нового дочернего класса, нам нужно передать три аргумента:

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

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

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

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

Вы подали мне идею. Я просто добавил это в аргументы. Вы спасли меня. Спасибо. @МагнусЭрикссон

Tommy J 19.06.2019 16:38

Другие вопросы по теме