首页 > 解决方案 > Akénéo 服务 pim_catalog.saver.product 是私有的,不能在我的捆绑包的控制器中使用

问题描述

根据文档https://docs.akeneo.com/4.0/manipulate_pim_data/product/save.html,我应该能够调用$saver = $this->get('pim_catalog.saver.product');我的包的控制器,如下所示:

<?php
namespace XXX\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;

class ExportController extends Controller
{
    public function exportProduct($id): Response
    {
        $saver = $this->get('pim_catalog.saver.product');
        $saver->save($id);

    
        return new Response(
            '<html><body>foo</body></html>'
        );
    }

}

但是我收到此错误:

[2020-11-05 13:44:58] request.CRITICAL:未捕获的 PHP 异常 Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException:“当容器被删除时,“pim_catalog.saver.product”服务或别名已被删除或内联已编译。您应该将其公开,或者直接停止使用容器并改用依赖注入。” 在 /var/www/html/pim/vendor/symfony/dependency-injection/Container.php 第 275 行 {"exception":"[object] (Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException(code: 0): The " pim_catalog.saver.product" 服务或别名在容器编译时已被删除或内联。您应该将其公开,或者直接停止使用容器并改用依赖注入。

所以我想通过services.YML在我的包的配置目录 ( mybundle/Resources/config/services.YML) 中添加一个文件来覆盖这个服务的声明:

services:
  pim_catalog.saver.product:
    public: true
    priority: 999

但是它仍然不起作用。

根据 Symfony 4 的文档,我可能应该创建一个扩展类。它应该与 Akénéo 的名称相同,但我没有找到后者。

我应该怎么办?

标签: symfonysymfony4akeneo

解决方案


您在错误消息中有一些提示。

编译容器时,“pim_catalog.saver.product”服务或别名已被删除或内联。您应该将其公开,或者直接停止使用容器并改用依赖注入

作为最佳实践,我不鼓励将其公开,因为您不是服务提供商,并且有更好、更简单的方法来解决您的问题。因此,您只剩下第二个选择,这是我的拙见。

我不具体了解 Akeneo,但我知道 Symfony 和依赖注入。所以我建议在你的控制器方法中使用参数类型提示。

1. 检查用于服务“pim_catalog.saver.product”的自动装配类/接口

列出所有定义的自动装配并查找提到“pim_catalog.saver.product”的那个

console debug:autowiring

或者只检查名称中带有 akeneo 的所有自动装配类/接口(这很可能)

console debug:autowiring akeneo

2. 更新您的控制器代码以添加类型提示参数

以下内容中的内容

<?php
namespace XXX\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;

// I just picked that interface after looking it up in Akeneo documentation
// But there is another one that can be used if you want to save multiple
// products, so beware.
use Akeneo\Tool\Component\StorageUtils\Saver\SaverInterface;

class ExportController extends Controller
{
    public function exportProduct($id, SaverInterface $saver): Response
    {
        $saver->save($id);

        return new Response(
            '<html><body>foo</body></html>'
        );
    }

}

该过程记录在此处https://symfony.com/doc/4.4/controller.html#fetching-services

3.(希望)享受工作代码!

;-)


推荐阅读