当前位置: 首页 > 知识库问答 >
问题:

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

白和泽
2023-03-14

根据文件,,https://docs.akeneo.com/4.0/manipulate_pim_data/product/save.html,我应该能够调用$saver=$this-

<?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”“在编译容器时,服务或别名已被删除或内联。您应该将其公开,或者停止直接使用容器,改用依赖注入。“at/var/www/html/pim/vendor/symfony/dependency injection/container.php第275行{“exception”:“[object](symfony\Component\dependency injection\exception\ServiceNotFoundException(代码:0):“pim\u catalog.saver.product”在编译容器时,服务或别名已被删除或内联。您应该将其公开,或者停止直接使用容器,改用依赖项注入。at/var/www/html/pim/vendor/symfony/dependency injection/container.php:275)“}[]

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

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

然而,它仍然不起作用。

根据symfony4的文档,我可能应该创建一个扩展类。它应该和Akénéo的名字相同,但我找不到后者。

我该怎么办?


共有1个答案

后源
2023-03-14

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

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

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

我不知道Akeneo的具体情况,但我知道Symfony和依赖注入。因此,我建议在控制器方法中使用参数typehint。

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.(希望)享受工作代码!

;-)

 类似资料:
  • 我正在将我的spring-java项目转移到OSGi。 我有一些依赖项,这些依赖项在spring ebr repo或maven repo中不能作为包提供。处理它们的最佳方法是什么? null

  • 我编写了一个定制的NiFi处理器,它使用一些Hadoop类,处理流文件,并在Avro之间序列化流文件。 处理器的pom.xml文件如下所示: 因为我已经将标记为,所以它不会绑定在生成的NAR文件中。现在,我可以做一个快速修复,完全删除作用域并创建NAR,但NiFi会抱怨next class not found错误。 我想知道:

  • 问题内容: 我正在使用socket.io在我的应用中启用聊天功能,并且正在使用一项服务来执行所有套接字操作。当出现消息时,我想从服务中触发控制器的功能以在UI中进行一些更改。所以我想知道如何从服务访问控制器的功能。样例代码: 这是服务的示例代码。 现在控制器的代码 问题答案: 您可以通过使用角度事件或来实现此目的。 在您的情况下会有所帮助,您需要广播事件,以便具有相同事件名称的所有子作用域都可以监

  • 我有与SQLite数据库工作的应用程序。我把它打包成一个包,我可以看到服务组合上的服务。当我发送请求到发布或获取服务我收到这个错误: JAVAlang.ClassNotFoundException:org。sqlite。未找到JDBC 我在servicemix上安装了SQLite JDBC驱动程序,但仍然出错。 这是我的POM: 我试图把这个组织。旱生。sqlite jdbc仅作为导出包和导入包,

  • 我将symfony 3迁移到symfony 4.3,并且我的自定义包移动到:src/Bundles/FooBundle。 structure FooBundle:-依赖注入-配置。php-FooExtension。php-Event-Model-Resources-config-services。yml-Service-Twig-Exception-FooBundle。php 和文件bundle/