Shopware 6自定义Admin API端点:新增资源实现方案
解决Shopware 6.4自定义实体API增删改的几种途径
针对你的需求,有三个可行方案实现自定义实体的API增删改操作:
1. 直接使用Shopware自动生成的Admin API端点
只要你的自定义实体是按Shopware规范创建(正确定义EntityDefinition并完成系统注册),Shopware的Admin API会自动为它生成完整的CRUD端点,无需额外开发:
- 创建实体:
POST /api/v3/{你的自定义实体名称},请求体传入实体字段数据 - 更新实体:
PATCH /api/v3/{你的自定义实体名称}/{实体ID},传入需修改的字段 - 删除实体:
DELETE /api/v3/{你的自定义实体名称}/{实体ID}
需要确保API用户拥有对应实体的操作权限(在Shopware后台用户权限中配置),请求时携带Admin API认证令牌即可。
2. 编写自定义Symfony控制器
如果自动生成的端点无法满足自定义业务逻辑需求,可以编写Symfony控制器处理POST请求:
<?php namespace YourPlugin\Controller\Api; use Shopware\Core\Framework\Context; use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; #[Route(defaults: ['_routeScope' => ['api']])] class CustomEntityController extends AbstractController { public function __construct(private EntityRepositoryInterface $customEntityRepository) { } #[Route(path: '/api/v3/custom-entity/create', methods: ['POST'])] public function create(Request $request, Context $context): JsonResponse { $data = $request->toArray(); // 调用repository的upsert方法(支持创建和更新) $this->customEntityRepository->upsert([$data], $context); return new JsonResponse(['status' => 'success']); } #[Route(path: '/api/v3/custom-entity/delete/{id}', methods: ['DELETE'])] public function delete(string $id, Context $context): JsonResponse { $this->customEntityRepository->delete([['id' => $id]], $context); return new JsonResponse(['status' => 'deleted']); } }
编写完成后,在插件的services.xml中注册该控制器,或利用Symfony自动配置完成注册。
3. 在App Script中获取完整的Repository实例
如果必须通过App Script实现,可以通过services.container获取包含增删改方法的完整EntityRepositoryInterface实例:
// 在App Script的POST端点逻辑中 const repository = services.container.get('your_custom_entity.repository'); const context = services.context; // 创建实体 const newEntity = { name: 'Test Entity', // 其他字段... }; repository.upsert([newEntity], context); // 删除实体 repository.delete([{ id: '实体ID' }], context);
注意需在App的manifest文件中配置对应实体的操作权限,确保App拥有足够权限执行相关操作。
内容的提问来源于stack exchange,提问作者ciekals11
相关产品推荐
相关产品推荐

