Я пытаюсь внедрить одну службу в другую, чтобы вызвать из нее функцию, но выдает ошибку:
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
Кажется, вы просто вводите неправильную зависимость при создании экземпляра класса. Проблема в том, где он создается, а не в опубликованном коде.
Я создаю экземпляр существующего класса службы AccountService. Я не знаю, где проблема. Можете показать на примере? @МагнусЭрикссон
Я создаю экземпляр существующего класса службы AccountService. Я не знаю, где проблема. Можете показать на примере? @AndreiLupuleasa
Покажите нам все соответствующий код. Прямо сейчас мы даже не знаем, какой класс вы опубликовали. Мы можем видеть конструктор и то, что он ожидает экземпляр AccountService в конструкторе, но это все. Нам нужно увидеть, где вы создаете экземпляр опубликованного класса (поскольку именно здесь находится ваша проблема).
Извините, ShopService на самом деле является MainService, поскольку я редактировал свой код. Я обновил это сейчас. Спасибо @MagnusEriksson
Не волнуйтесь. Но вы все еще не опубликовали, где вы создаете экземпляр этого класса.
Я не так хорош с английским, поэтому я не знаю, что это означает. Я опубликовал логику, с которой работаю. @МагнусЭрикссон
Инстанцируйте, создайте новый экземпляр класса. Это должен быть либо new ShopService(....), либо определенный в каком-либо поставщике услуг или аналогичный (я не работал с фреймворком Symfony, поэтому я не уверен, где вы регистрируете классы в контейнере).
Возможно, вы думаете о service.yml. Я добавил код выше. @МагнусЭрикссон
arguments: ["@service_container", "@doctrine.orm.default_entity_manager"] - Вероятно, первым аргументом должно быть AccountService, а не контейнер. Кроме того, вам, похоже, не нужен второй аргумент (смотря на конструктор класса, он ожидает только один аргумент).
Эти два аргумента являются аргументами расширенного класса BaseService, который я ввел выше. у него есть $container и $em varibale. Итак, parent::__construct() отсутствует. @МагнусЭрикссон






Когда вы расширяете класс, у которого есть аргументы конструктора, вы должны сохранить эти аргументы и добавить после них любые дополнительные аргументы.
Пример:
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, но концепция та же.
Вы подали мне идею. Я просто добавил это в аргументы. Вы спасли меня. Спасибо. @МагнусЭрикссон
Где вы создаете экземпляр этого класса?