Конфликт между 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
Другие вопросы по тегам