Я использую встроенный SOAP-сервер в приложении symfony2 и помимо обработки StdClass-Object, мне нужно будет прочитать полный xml, полученный для отладки и ведения журнала. Есть ли способ просто перехватить перенесенный xml? Он должен быть где-то в заголовке запроса, но я просто не могу его найти.
Я искал то же самое и, наконец, нашел его. Надеюсь, это поможет вам или кому-то еще.
$postdata = file_get_contents("php://input");
В переменной $postdata
будет использоваться необработанный XML. Найдено через следующие две ссылки:
http://php.net/manual/en/reserved.variables.httprawpostdata.php
Необработанный XML-код, передаваемый в конверте SOAP, должен находиться в теле POST. В приложении Symfony вы можете получить тело запроса POST, создав объект Request и вызвав его метод getContents () .
Вы можете легко получить содержимое запроса в контроллере, например:
// src/MyProject/MyBundle/Controller/MyController.php use Symfony\Component\HttpFoundation\Request; ... $request = Request::createFromGlobals(); $soapEnvelope = $request->getContents();
Лучшая практика (для Symfony 2.4+) заключается в том, чтобы ввести RequestStack в свой класс обслуживания в контейнер службы. Вы можете сделать это как аргумент конструктора для своего класса обслуживания, вызвав метод setter и т. Д. Вот краткий пример, использующий инъекцию через конструктор.
В вашем сервисном контейнере:
// src/MyProject/MyBundle/Resources/config/services.xml <service id="my.service" class="MyServiceClass"> <argument type="service" id="request_stack" /> </service>
Затем в вашем классе обслуживания:
// src/MyProject/MyBundle/Service/MyService.php use Symfony\Component\HttpFoundation\RequestStack; .... class MyServiceClass { /** * @var RequestStack $rs */ private $requestStack; /** * Constructor * * @param RequestStack $requestStack */ public function __construct(RequestStack $requestStack) { $this->requestStack = $requestStack; } /** * Some method where you need to access the raw SOAP xml */ public function myMethod() { $request = $this->requestStack->getCurrentRequest(); $soapEnvelope = $request->getContents(); } }
Справочная документация:
http://symfony.com/blog/new-in-symfony-2-4-the-request-stack