Symfony:未加载其他服务中的服务(参数太少)

Symfony: Service in other Service not loaded (Too few arguments)

背景

我有一个正在查找数据库的 OptionHelper-Class-table,我在其中存储了一些灵活的参数。 class 在控制器中运行良好。

现在我想在另一个服务的功能中使用这个 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 中添加一些内容?但是我不知道该怎么做。

在此先感谢您的帮助!

对于要自动注入的服务,您必须在 service.yaml 中将自动装配和自动配置选项设置为 true,如 symfony 文档中所述: https://symfony.com/doc/current/service_container/autowiring.html

像这样:

config/services.yaml

services: 
       _defaults: 
              autowire: true 
              autoconfigure: true 

过了一段时间我发现了问题。 看起来你永远不应该这样做,因为它会禁用自动装配功能。

  • 使用new ClassName($x, $y)创建一个新实例
  • 仅在 class
  • 的构造函数中使用可自动装配的服务

错误

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