> Symfony中文手册 > 如何在Symfony控制器中创建SOAP Web Service

如何在Symfony控制器中创建SOAP Web Service

EN本篇文档待译。点击查看官方英文原档。我们将很快返回这里,敬请期待。

设置一个控制器令其充当Soap服务器,在一些工具的帮助下,是非常简单的。当然,你必须,安装了一个PHP SOAP扩展。由于PHP的SOAP扩展在当前还不能直接生成WSDL,你必须自行创建一个或使用第三方的生成器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// src/Acme/SoapBundle/Services/HelloService.php
namespace Acme\SoapBundle\Services;
 
class HelloService
{
    private $mailer;
 
    public function __construct(\swift_Mailer $mailer)
    {
        $this->mailer = $mailer;
    }
 
    public function hello($name)
    {
 
        $message = \Swift_Message::newInstance()
                                ->setTo('me@example.com')
                                ->setSubject('Hello Service')
                                ->setBody($name . ' says hi!');
 
        $this->mailer->send($message);
 
        return 'Hello, '.$name;
    }
}
1
2
3
4
5
# app/config/services.yml
services:
    hello_service:
        class: Acme\SoapBundle\Services\HelloService
        arguments: ['@mailer']
1
2
3
4
5
6
<!-- app/config/services.xml -->
<services>
    <service id="hello_service" class="Acme\SoapBundle\Services\HelloService">
        <argument type="service" id="mailer"/>
    </service>
</services>
1
2
3
4
// app/config/services.php
$container
    ->register('hello_service', 'Acme\SoapBundle\Services\HelloService')
    ->addArgument(new Reference('mailer'));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace Acme\SoapBundle\Controller;
 
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Httpfoundation\Response;
 
class HelloServiceController extends Controller
{
    public function indexAction()
    {
        $server = new \SoapServer('/path/to/hello.wsdl');
        $server->setObject($this->get('hello_service'));
 
        $response = new Response();
        $response->headers->set('Content-Type', 'text/xml; charset=ISO-8859-1');
 
        ob_start();
        $server->handle();
        $response->setContent(ob_get_clean());
 
        return $response;
    }
}
1
2
3
$client = new \Soapclient('http://example.com/app.php/soap?wsdl');
 
$result = $client->call('hello', array('name' => 'Scott'));

下面是一个WSDL的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?xml version="1.0" encoding="ISO-8859-1"?>
<definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:tns="urn:arnleadservicewsdl"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    targetNamespace="urn:helloservicewsdl">
 
    <types>
        <xsd:schema targetNamespace="urn:hellowsdl">
            <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
            <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" />
        </xsd:schema>
    </types>
 
    <message name="helloRequest">
        <part name="name" type="xsd:string" />
    </message>
 
    <message name="helloResponse">
        <part name="return" type="xsd:string" />
    </message>
 
    <portType name="hellowsdlPortType">
        <operation name="hello">
            <documentation>Hello World</documentation>
            <input message="tns:helloRequest"/>
            <output message="tns:helloResponse"/>
        </operation>
    </portType>
 
    <binding name="hellowsdlBinding" type="tns:hellowsdlPortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="hello">
            <soap:operation soapAction="urn:arnleadservicewsdl#hello" style="rpc"/>
 
            <input>
                <soap:body use="encoded" namespace="urn:hellowsdl"
                    encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </input>
 
            <output>
                <soap:body use="encoded" namespace="urn:hellowsdl"
                    encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </output>
        </operation>
    </binding>
 
    <service name="hellowsdl">
        <port name="hellowsdlPort" binding="tns:hellowsdlBinding">
            <soap:address location="http://example.com/app.php/soap" />
        </port>
    </service>
</definitions>