Мыльный веб-сервис с symfony2

Мне нужно создать веб-сервисы с symfony2, я прочитал официальную статью http://symfony.com/doc/current/cookbook/web_services/php_soap_extension.html в примере он создает экземпляр SoapServer с параметром, маршрутизирующим файл.wsdl, что это за файл? я не нашел слишком много документации о мыле в Symfony. помогите пожалуйста?

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;
}

2 ответа

Я не уверен, что вы нашли свой ответ или нет. Просто для всех, кто может столкнуться с такой проблемой:

WSDL - это язык, на котором определяются и описываются веб-службы. В основном это XML-файл, содержащий параметры ввода / вывода для каждой функции, обслуживаемой сервером. он также содержит некоторую информацию о самом сервере, который предоставляет услуги.

чтобы иметь возможность создавать веб-сервис, вам нужно использовать предоставленный вами код, который фактически подготовил бы Symfony к обслуживанию клиентов по "/path/to/hello.wsdl" (в моем примере этот путь - /YourDesiredPathFor/services.wsdl), а также вам необходимо предоставить действительный документ WSDL, содержащий информацию, упомянутую выше, в правильном формате WSDL. проблема в том, что Symfony (или даже сам PHP в этом отношении) не имеет средств для автоматического создания файла.

Чтобы решить эту проблему, вам нужно использовать внешний генератор WSDL. Я бы предложил использовать PHP-WSDL-Creator. Он использует аннотации, записанные в файлах php, для создания файла WSDL, а также запускает SoapServer. это означает, что вам даже не понадобится код, который вы предоставили. он также имеет надлежащие интерфейсы и дополнения, которые предоставляют вам клиенты для различных протоколов и языков.

Вы должны немного подправить его! если вы хотите, чтобы это было по стандартам Symfony, я думаю, вам нужно будет переписать некоторые его части; но если вы хотите использовать его как внешнюю библиотеку, он также может работать! я сделал это, скопировав извлеченные файлы в./vendor/php_wsdl/lib/php_wsdl/src (правда, не так ли? может быть, более простой путь тоже подойдет!); затем определил php_wsdl.php в./vender/php_wsdl/lib/php_wsdl:

<?php

require_once __DIR__. '/src/class.phpwsdl.php';

class WSDL_PhpWsdl extends PhpWsdl{
}

затем в "./app/autoload.php" я добавил следующую строку, чтобы Symfony мог использовать созданное расширение:

require_once __DIR__. '/../vendor/php_wsdl/lib/php_wsdl/php_wsdl.php';

только одна вещь! расширению нужна папка "cache", чтобы кэшировать созданные файлы wsdl и все. к сожалению, потому что мне нужно быстро завершить проект, у меня нет достаточно времени, чтобы управлять папкой кеша, как и должно быть. Есть определенно лучшие способы, чем мой путь, и я был бы очень рад узнать о них.

в любом случае, теперь вам нужно использовать возможности расширения! Для этого я создал "ServerController" для пакета, который я использовал:

<?php
namespace Tara\PageControllerBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;

class ServiceController extends Controller
{
    function wsdlAction(){

        \PhpWsdlServers::$EnableRest = false;

        $soap= \WSDL_PhpWsdl::CreateInstance(
            null,                               // PhpWsdl will determine a good namespace
            $this->generateUrl('service_wsdl', array(), true),  // Change this to your SOAP endpoint URI (or keep it NULL and PhpWsdl will determine it)
            __DIR__. '/cache',                  // Change this to a folder with write access
            Array(                              // All files with WSDL definitions in comments
                dirname(__FILE__). '/../Services/MyService.php'
            ),
            null,                               // The name of the class that serves the webservice will be determined by PhpWsdl
            null,                               // This demo contains all method definitions in comments
            null,                               // This demo contains all complex types in comments
            false,                              // Don't send WSDL right now
            false                               // Don't start the SOAP server right now
        );

        if($soap->IsWsdlRequested())            // WSDL requested by the client?
            $soap->Optimize=false;              // Don't optimize WSDL to send it human readable to the browser

        $soap->RunServer();
    }
}

Как вы можете видеть, путь к папке кэша находится в локальном каталоге, что означает, что он должен быть создан вручную и в./src/Tara/PageControllerBundle/Controller (очевидно, в моем случае; вам нужно будет изменить пути), Я уверен, что есть лучшие способы управления папкой кеша. там есть строка:

dirname(__FILE__). '/../Services/MyService.php

эта строка сообщает расширению, где искать аннотации для создания страницы WSDL. вам также нужно определить маршрут к "service_wsdl":

service_wsdl:
    pattern: /YourDesiredPathFor/services.wsdl
    defaults: {_controller: TaraPageControllerBundle:Service:wsdl}

как видите, контроллером является ServiceController, а ответственной за него функцией является wsdlAction; точная функция, которая была определена!

просто в качестве примера я бы предоставил свой собственный MyService.php:

<?php

namespace Tara\PageControllerBundle\Services;


use Tara\PageControllerBundle\Model\...

/**
 * @service Tara\PageControllerBundle\Services\MyService
 */

class MyService
{
    /**
     * Function Create
     *
     * @param string $link
     * @param string $title
     * @param string $image
     * @param string $description
     * @return boolean Status of the creation
     * @pw_rest POST /YourDesiredPathForAction/create Create The Object
     *
     */

    public function Create($link, $title, $image, $description)
    {

        // your code that handles the data goes here. this is not a part of the annotations!
        return (bool)$result;
    }
}

Теперь вы можете использовать SoapClient для подключения к веб-службе по адресу

http: //your-server.something/YourDesiredPathFor/services.wsdl?wsdl

и вызвать функцию Create! Вы также можете проверить вывод расширения, открыв указанный выше адрес. расширение также предоставляет "читабельную" версию на

http: //your-server.something/YourDesiredPathFor/services.wsdl.

Я был бы рад узнать, была ли это хоть какая-то помощь!:)

SOAP - это более общая концепция, с которой Symfony предполагает, что вы знакомы. Внизу страницы, на которую вы ссылаетесь, есть пример WSDL. Посмотрите учебники по SOAP и WSDL, а затем попытайтесь воссоздать то, что они делают, на странице Symfony.

Учебник по SOAP

Учебник по WSDL

Другие вопросы по тегам