我正在使用Symfony2应用程序中内置的SOAP服务器,并且除了处理StdClass-Object外,我还需要读取完整的收到的XML以进行调试和日志记录。是否有一种方法可以简单地捕获传输的XML?它应该在请求头中的某个地方,但我无法找到它。
我正在使用Symfony2应用程序中内置的SOAP服务器,并且除了处理StdClass-Object外,我还需要读取完整的收到的XML以进行调试和日志记录。是否有一种方法可以简单地捕获传输的XML?它应该在请求头中的某个地方,但我无法找到它。
$postdata = file_get_contents("php://input");
$postdata
变量将包含原始的XML数据。可通过以下两个链接找到详细信息:http://php.net/manual/zh/reserved.variables.httprawpostdata.php
SOAP信封中传输的原始XML应该在POST请求体中。在Symfony应用程序中,您可以通过创建一个Request对象并调用其getContents()方法来获取POST请求的主体。
您可以轻松地在控制器中获取请求内容,如下所示:
// 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
这篇文档介绍了Symfony 2.4中的新功能——请求堆栈。它允许您轻松地在应用程序的不同部分之间共享请求信息,例如请求方法,URI和请求参数。此外,它还可以帮助您更好地管理子请求。