symfony - 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 的名称相同,但我没有找到后者。
我应该怎么办?
解决方案
您在错误消息中有一些提示。
编译容器时,“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.(希望)享受工作代码!
;-)
推荐阅读
- java - 尽管没有在任何地方清除,但构造函数中的 ArrayList 分配的数据正在丢失其数据
- reactjs - 从 Facebook API React 获取数据
- angular - 在 Angular 9 中的 Mapbox 地图上添加多边形
- android - 未解决的参考:asLiveData 同时将 Flow 转换为 LiveData
- javascript - Stripe Connect form.dataset 未通过 API 密钥
- flask-login - Flask 登录 - 使用 Firebase
- jquery - 在不使用 .execCommand() 的情况下缩进 contenteditable div
- r - 在 R 中使用“扫帚”提取模型样本大小
- amazon-web-services - 将多行 JSON 日志上传到 AWS CloudWatch Log
- python - 将搜索结果链接到其自己的详细信息页面