如何在Shopware 6中实现API请求与响应日志记录?
在Shopware 6中记录API请求与响应的方法
方法一:通过事件订阅结合内置日志系统实现自定义记录
这是最灵活的方式,可按需过滤和记录API请求/响应细节:
- 创建事件订阅类,监听Symfony的
kernel.request和kernel.response事件,仅针对API路由处理:
<?php namespace YourPlugin\Subscriber; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpKernel\Event\ResponseEvent; use Psr\Log\LoggerInterface; class ApiLoggerSubscriber implements EventSubscriberInterface { private $logger; public function __construct(LoggerInterface $logger) { $this->logger = $logger; } public static function getSubscribedEvents(): array { return [ RequestEvent::class => 'onKernelRequest', ResponseEvent::class => 'onKernelResponse', ]; } public function onKernelRequest(RequestEvent $event): void { $request = $event->getRequest(); // 过滤仅/api开头的路由 if (str_starts_with($request->getPathInfo(), '/api/')) { $this->logger->info('API Request', [ 'method' => $request->getMethod(), 'uri' => $request->getRequestUri(), 'headers' => $request->headers->all(), 'content' => $request->getContent(), 'client_ip' => $request->getClientIp() ]); } } public function onKernelResponse(ResponseEvent $event): void { $request = $event->getRequest(); $response = $event->getResponse(); if (str_starts_with($request->getPathInfo(), '/api/')) { $this->logger->info('API Response', [ 'status_code' => $response->getStatusCode(), 'headers' => $response->headers->all(), 'content' => $response->getContent() ]); } } }
- 在插件的
src/Resources/config/services.xml中注册该订阅者:
<service id="YourPlugin\Subscriber\ApiLoggerSubscriber"> <argument type="service" id="logger"/> <tag name="kernel.event_subscriber"/> </service>
- 日志会输出到Shopware的默认日志文件中,开发环境为
var/log/dev.log,生产环境为var/log/prod.log。
方法二:利用Symfony Profiler(仅开发环境)
开发环境下,直接访问Shopware项目的/_profiler路径,找到对应的API请求条目,即可查看完整的请求头、请求体、响应头及响应体内容,适合临时调试,无需额外开发工作。
方法三:自定义持久化存储(按需扩展)
如果需要将API日志持久化到数据库或其他存储介质,可以基于事件订阅的逻辑,创建自定义实体(如ApiLogEntity),在事件处理方法中将请求/响应数据写入实体并保存到数据库,方便后续查询和分析。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

