找不到服务“sylius.repository.product”:即使它存在于应用程序的容器中,“App\Controller\Shop\SubscribeBoxController”内的容器是一个较小的服务定位器,只知道“doctrine”、“form.factory”,“http_kernel”,“parameter_bag”,“request_stack”,“路由器”,“security.authorization_checker”,“security.csrf.token_manager”,“security.token_storage”,“序列化器”,“ session ”,"template"和“ Twig ”服务。尝试改用依赖注入(inject)。
当我尝试在 Controller 上使用 sylius 服务时,出现此错误:
public function index(Request $request)
{
$subscribed = new Subscribed();
$subscribeForm = $this->createForm(SubscribeType::class, $subscribed);
$subscribeForm->handleRequest($request);
if ($subscribeForm->isSubmitted() && $subscribeForm->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($subscribed);
$entityManager->flush();
return $this->redirectToRoute('subscribe_details');
}
/** @var ProductRepository $productRepository */
$productRepository = $this->get('sylius.repository.product');
$product = $productRepository->findAll();
return $this->render('@SyliusShop/Subscribe/plan.html.twig', [
'form' => $subscribeForm->createView(),
'product' => $product,
]);
}
因此,如果有人知道此错误,请告诉我! :)
最佳答案
Symfony 似乎正在从直接服务容器访问转向使用依赖注入(inject)来获取 Controller 内的服务。此外,Sylius 完全接受了这一点——他们自己的大多数 Controller 甚至没有扩展旧的基本 Symfony Controller 。
有两件事您可以尝试。首先,如果您想直接从服务容器访问服务(并且这些服务是公共(public)的),您可以在构造函数中注入(inject)服务容器的实例。
private $fullServiceContainer;
public function __construct(
\Symfony\Component\DependencyInjection\ContainerInterface $container
) {
$this->fullServiceContainer = $container;
}
//...
$this->fullServiceContainer->get('sylius.repository.product')
其次,如果服务的名称或别名看起来像 PHP 类,您可以自己注入(inject)服务。我看到容器中存在 sylius.repository.product
服务
$ php bin/console debug:container sylius.repository.product
Information for Service "sylius.repository.product"
===================================================
---------------- ---------------------------------------------------------
Option Value
---------------- ---------------------------------------------------------
Service ID sylius.repository.product
Class Sylius\Bundle\CoreBundle\Doctrine\ORM\ProductRepository
Tags -
Public yes
Synthetic no
Lazy no
Shared yes
Abstract no
Autowired no
Autoconfigured no
---------------- ---------------------------------------------------------
但是它的类 - Sylius\Bundle\CoreBundle\Doctrine\ORM\ProductRepository
似乎没有链接到服务。
$ php bin/console debug:container ProductRepository
No services found that match "ProductRepository".
这意味着如果您想注入(inject)产品存储库,您需要在自己的 Symfony 应用程序中创建一个别名,而这开始超出单个 Stack Overflow 答案的范围。
如果您想了解 Sylius/Symfony 和服务容器,您可能会对两篇文章(自链接)感兴趣。
Symfony: Autowiring Services https://alanstorm.com/symfonys-service-container/
关于php - 无法使用sylius服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54634406/