2016-09-30 6 views
1

Я делаю некоторый Rest и некоторые SOAP услуг, для REST те, которые я использую FOSRestBundle и для типа SOAP Я использую BeSimple Soap Bundle (это действительно не так актуально, так как проблема связана с прослушивателем IMO, но я говорю это на всякий случай).Конфликта между BeSimple Soap расслоением и FOSRest Bundle

Дело в том, что 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 обрабатывать ответы типа мыла.

Edit:

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 для обоих Rest конечных точек и 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: "Format 'soap' not supported, handler must be implemented" at /home/teampro/Sites/corinto/vendor/friendsofsymfony/rest-bundle/View/ViewHandler.php line 292 {"exception":"[object] (Symfony\Component\HttpKernel\Exception\UnsupportedMediaTypeHttpException(code: 0): Format 'soap' not supported, handler must be implemented at /.../vendor/friendsofsymfony/rest-bundle/View/ViewHandler.php:292)"} []

+0

Пожалуйста, обновите свой вопрос с 'config', это довольно сложно читать строки :) Кроме того, вы могли бы поделиться своим кодом? – Samundra

+0

@ Samundra Done, это не мой код (не могу опубликовать его здесь), но на самом деле это фиктивный пример, поэтому он кричит на то же самое. – Astaroth

ответ

1

Вы можете определить, как сделать правила, чтобы слушать, как this в 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 

Надежда эта помощь !!

+0

У вас есть время для тестирования? Я сделал тот же API на сервере, и это хорошо работает. –

0

во-первых, в явной форме отдельные ресурсы маршрутизации с 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 controlller обрабатывает маршрут WS, как он перекрывается configuraiton. Разделение пространств имен маршрута с помощью префиксов может помочь.

Во-вторых, проверить запрос хоста, так как конфигурация уже раскалывает rouiting на основе запроса переменной хоста

В-третьих, проверьте конфигурацию маршрутизации с

bin/console debug:router 
bin/console router:match 
+0

Они отделены друг от друга, остальные имеют префикс: «api» (я просто забыл поместить его на OP). Во всяком случае, у них тоже есть хозяин. Речь идет не о групповом столкновении, а о слушателе FOS, который пытается обрабатывать ВСЕ ** ответы **, даже те, которые являются SOAP. – Astaroth