Конфликт между BeSimple Soap bundle и FOSRest Bundle
Я делаю некоторые Rest и некоторые сервисы SOAP, для REST, которые я использую FOSRestBundle
и для типа SOAP я использую BeSimple Soap Bundle
(это действительно не так актуально, так как проблема с FOSRest
слушатель ИМО, но я говорю это на всякий случай).
Дело в том, что FOSRest
предлагает слушателю обработать ответы и сериализовать / отобразить их следующим образом:
<?php
/**
* @Rest\View
*/
public function getAction()
{
return $item;
}
И он обрабатывает ответ, сериализующий его в JSON/XML
или что угодно. Конфликт возникает, когда я пытаюсь вызвать свои службы SOAP, и слушатель кричит на меня, говоря, что он не поддерживает SOAP
как формат (он поддерживает JSON, XML и т. д.).
Это происходит когда я ставлю view_response_listener: 'force'
в мой файл конфигурации FOSRest yml. Если я изменю это на view_response_listener: 'enabled'
сервисы SOAP работают, но я, кажется, теряю столь удобную возможность FOSRest для автоматической обработки моих ответов.
Как я мог добиться того, чтобы FOSRest view_response_listener
просто обрабатывает правильные ответы, позволяя SOAP Bundle
обрабатывать ответы типа мыла.
Редактировать:
fos_rest:
param_fetcher_listener: true
body_listener: true
format_listener: true
view:
view_response_listener: 'force' #This is the parameter that is driving me crazy. Value to 'force' Rest controllers work just fine SOAP don't, value to 'enabled' the other way around
formats:
xml: true
json : true
templating_formats:
html: true
force_redirects:
html: true
failed_validation: HTTP_BAD_REQUEST
default_engine: twig
routing_loader:
default_format: json
Это FOSRestBundle
конфигурации.
Вот мой routing.yml
для конечных точек отдыха и SOAP:
#config/routing.yml
rest_api:
resource: "@RESTBundle/Resources/config/api_routes.yml"
host: "%host_front%" #api.myproject.local
type: rest
#api_routes.yml detail
accounts:
resource: 'RESTBundle\Controller\AccountsController'
type: rest
name_prefix: api_
#config/routing.yml
soap_api:
resource: "@SOAPBundle/Resources/config/soap_routing.yml"
host: "%host_ws%"
prefix: "%contexto_ws%"
#soap_routing.yml detail
_besimple_soap:
resource: "@BeSimpleSoapBundle/Resources/config/routing/webservicecontroller.xml"
soap_ws:
resource: "@SOAPBundle/Controller/"
type: annotation
Пример RestController:
<?php
namespace RESTBundle\Controller\API;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\FOSRestController;
use Nelmio\ApiDocBundle\Annotation\ApiDoc as ApiDoc;
use Symfony\Component\HttpFoundation\Request;
/**
* @Rest\RouteResource("accounts", pluralize=false)
*/
class AccountsController extends FOSRestController
{
/**
* @Rest\View
*/
public function getAction($userId)
{
return [
['name' => 'Example', 'pass'=> 'example'],
['name' => 'Example2', 'pass'=> 'example2']
];
}
}
Контроллер SOAP:
/**
* @Soap\Header("user", phpType="string")
* @Soap\Header("token", phpType="string")
*/
class AccountsController implements ContainerAwareInterface
{
use ContainerAwareTrait;
/**
* @Soap\Method("getAccounts")
* @Soap\Param("account", phpType="SOAPBundle\DataType\AccountFilter" )
*
* @Soap\Result(phpType="SOAPBundle\DataType\Account[]"")
*/
public function getAccountsAction(Request $request, AccountFilter $filter)
{
return [(new Account())->setName('Example')->setPass('example')] //This is just an example
}
}
Изменить с ошибкой:
request.ERROR: Uncaught PHP Exception Symfony \ Component \ HttpKernel \ Exception \ UnsupportedMediaTypeHttpException: "Формат" мыло "не поддерживается, обработчик должен быть реализован" в /home/teampro/Sites/corinto/vendor/friendsofsymfony/rest-bundle/View/ViewHandler.php строка 292 {"исключение":"[объект] (Symfony\Component\HttpKernel\Exception\UnsupportedMediaTypeHttpException(код: 0): формат" мыло "не поддерживается, обработчик должен быть реализован в /.../vendor/friendsofsymfony/rest-bundle/View/ViewHandler.php:292)"} []
2 ответа
Вы можете определить, как создавать правила для прослушивания, вот так в конфигурации fos_rest:
format_listener:
rules:
- { path: ^/, priorities: [ html, json, xml ], fallback_format: ~, prefer_extension: true } # default routes
- { path: '/soap', priorities: [xml], fallback_format: xml, prefer_extension: true } # your soap route
- { path: '^/rest', priorities: [xml, json], fallback_format: xml, prefer_extension: true } # your rest route
Надеюсь, это поможет!
Во -первых, простота отдельных ресурсов маршрутизации с prefix
имущество
# app/config/routing.yml
_besimple_soap:
resource: "@BeSimpleSoapBundle/Resources/config/routing/webservicecontroller.xml"
prefix: "%contexto_ws%"
rest_api:
resource: "@RESTBundle/Resources/config/api_routes.yml"
host: "%host_front%" #api.myproject.local
prefix: /rest
type: rest
На данный момент похоже, что ваш REST-контроллер обрабатывает маршрут WS, поскольку он перекрывается с помощью configuraiton. Разделение пространств имен маршрутов с префиксами может помочь.
Во-вторых, проверьте хост запроса, так как ваша конфигурация уже разбивает маршрутизацию на основе переменной хоста запроса.
В-третьих, проверьте конфигурацию маршрутизации с
bin/console debug:router
bin/console router:match