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);
}
背景
我有一个正在查找数据库的 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);
}