php - 无法使用sylius服务

标签 php symfony sylius

找不到服务“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’s Service Container

Symfony: Autowiring Services https://alanstorm.com/symfonys-service-container/

关于php - 无法使用sylius服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54634406/

相关文章:

yaml 中的 symfony2 工厂服务

php - Woocommerce 临时购物车税未根据第一个请求正确计算

php - Symfony2/Sylius 未检测到 stripe/stripe-php 库

php - 如何使用mysql php根据下拉列表动态更改div内容

php - 交响乐 4 : ignore kernel events coming from debug toolbar

php - symfony2 和 swiftmailer 的内存泄漏

symfony - 如何在不加载关联实体的情况下获取关联实体的 ID?

php - 具有挑战性的 SQL 查询

php - Symfony2 事件监听器作为服务