Мыльный веб-сервис с 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.