Symfony: служба в другой службе не загружена (слишком мало аргументов) - PullRequest
0 голосов
/ 11 июля 2020

Фон

У меня есть OptionHelper -Class, который ищет в таблице базы данных, где я храню некоторые гибкие параметры. Этот класс отлично работает в контроллерах.

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

OptionHelper. php

namespace App\Service;


use App\Entity\Options;
use Doctrine\ORM\EntityManagerInterface;

class OptionHelper {
    private $emi;

    public function __construct(EntityManagerInterface $emi) {
        $this->emi = $emi;
    }

    public function get(string $optionName) {
        $repository = $this->emi->getRepository(Options::class);
        $options    = $repository->findOneBy([ 'optionname' => $optionName ]);
        $value      = $options->getOptionvalue();

        return $value;
    }
}

CartItem. php

namespace App\Service

class CartItem {
    [...]
    public function __construct($name, $number, $id) {
        $this->name   = $name;
        $this->number = $number;
        $this->id     = $id;
    }
    [...]
    private function getPrice(OptionHelper $optionHelper) { //<-- ERROR in this line
        $price = $optionHelper->get('price');    
        return $price;
    }
}

Контроллер

   [...]
   public function addItem($name, $number, $id) {
      $cartItem = new CartItem($name, $number, $id);
   }

Сообщение об ошибке

Too few arguments to function App\Service\CartItem::getPrice(), 0 passed in /src/Service/CartItem.php on line 89 and exactly 1 expected

Вопрос

Почему он не работает в другом Сервисе? Я попытался также поместить его в конструктор CartItem -Class, но тоже не работает.

Нужно ли мне что-то добавлять в services.yaml? Но я понятия не имею, как это сделать.

Заранее спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

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

  • используйте new ClassName($x, $y) для создания нового экземпляра
  • используйте только autowired Services в конструкторе класса

неправильно

    public function __construct($name, $number, $id) {
        $this->name   = $name;
        $this->number = $number;
        $this->id     = $id;
    }
   public function addItem($name, $number, $id) {
      $cartItem = new CartItem($name, $number, $id);
   }

правильно

    public function __construct(OnlyServices $onlyServices) {
       [...]
    }

    public function create($name, $number, $id) {
        $this->name   = $name;
        $this->number = $number;
        $this->id     = $id;
    }
   public function addItem($name, $number, $id, CartItem $cartItem) {
      $cartItem->create($name, $number, $id);
   }
0 голосов
/ 11 июля 2020

Для автоматического внедрения сервисов вы должны установить для параметра autowiring и autoconfigure значение true в вашем service.yaml, как описано в symfony docs: https://symfony.com/doc/current/service_container/autowiring.html

Вот так :

config / services.yaml

services: 
       _defaults: 
              autowire: true 
              autoconfigure: true 
...