1 Отредактировано 6762632 (2015-06-02 15:34:25)

Тема: Soap сервис

Подскажите какой лучше бандл установить для soap сервиса? Кто чем пользуется?

Re: Soap сервис

Вроде как этот бандл был ничего для Soap - https://github.com/BeSimple/BeSimpleSoap

Сам Soap не использую сейчас. Больше неудобств с ним, чем какого-либо профита.

3

Re: Soap сервис

Спасибо! Вы всегда мне помогаете.

4

Re: Soap сервис

Может еще подскажите поподробнее как сделать?
Нужно написать вебсервис SOAP с одним методом, который принимает на вход строку текста и возвращает id (primary key) полученный при записи этой строки в базу данных. Сервис писать с использованием symfony2. На выбор 2 варианта: с ручной генерацией WSDL листа либо с автоматической на основе кода.

Re: Soap сервис

Вот же документация по этому делу default/smile
http://besim.pl/SoapBundle/soapserver/c … ation.html

6

Re: Soap сервис

По документации я делал, но не работает.

7

Re: Soap сервис

Помогите мне пожалуйста разобраться! Я наверное чего то не понимаю. Сделал все по документации как сдесь http://besim.pl/SoapBundle/soapserver/c … ation.html
добавил роутинг в файл app/config/routing.yml

acme_demo:
    resource: "@AcmeDemoBundle/Resources/config/routing.yml"
    prefix:   /
 
app:
    resource: "@AppBundle/Controller/"
    type:     annotation
 
_besimple_soap:
    resource: "@BeSimpleSoapBundle/Resources/config/routing/webservicecontroller.xml"
    prefix:   /ws

добавил сервис в файл app/config/config.yml

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: services.yml }
 
be_simple_soap:
    services:
        DemoApi:
            namespace:     http://soap.test/ws/DemoApi/1.0/
            binding:       rpc-literal
            resource:      "@AcmeDemoBundle/Controller/DemoController.php"
            resource_type: annotation
 
# Put parameters here that don't need to change on each machine where the app is deployed
# http://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
    locale: en
 
framework:
    #esi:             ~
    #translator:      { fallbacks: ["%locale%"] }
    secret:          "%secret%"
    router:
        resource: "%kernel.root_dir%/config/routing.yml"
        strict_requirements: ~
    form:            ~
    csrf_protection: ~
    validation:      { enable_annotations: true }
    #serializer:      { enable_annotations: true }
    templating:
        engines: ['twig']
        #assets_version: SomeVersionScheme
    default_locale:  "%locale%"
    trusted_hosts:   ~
    trusted_proxies: ~
    session:
        # handler_id set to null will use default session handler from php.ini
        handler_id:  ~
    fragments:       ~
    http_method_override: true
 
# Twig Configuration
twig:
    debug:            "%kernel.debug%"
    strict_variables: "%kernel.debug%"
 
# Assetic Configuration
assetic:
    debug:          "%kernel.debug%"
    use_controller: false
    bundles:        [ ]
    #java: /usr/bin/java
    filters:
        cssrewrite: ~
        #closure:
        #    jar: "%kernel.root_dir%/Resources/java/compiler.jar"
        #yui_css:
        #    jar: "%kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar"
 
# Doctrine Configuration
doctrine:
    dbal:
        driver:   pdo_mysql
        host:     "%database_host%"
        port:     "%database_port%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"
        charset:  UTF8
        # if using pdo_sqlite as your database driver:
        #   1. add the path in parameters.yml
        #     e.g. database_path: "%kernel.root_dir%/data/data.db3"
        #   2. Uncomment database_path in parameters.yml.dist
        #   3. Uncomment next line:
        #     path:     "%database_path%"
 
    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true
 
# Swiftmailer Configuration
swiftmailer:
    transport: "%mailer_transport%"
    host:      "%mailer_host%"
    username:  "%mailer_user%"
    password:  "%mailer_password%"
    spool:     { type: memory }

добавил аннотации в контроллер

<?php
 
namespace Acme\DemoBundle\Controller;
 
 
use BeSimple\SoapBundle\ServiceDefinition\Annotation as Soap;
use Symfony\Component\BrowserKit\Response;
use Symfony\Component\DependencyInjection\ContainerAware;
 
class DemoController extends ContainerAware
{
    /**
     * @Soap\Method("hello")
     * @Soap\Param("name", phpType = "string")
     * @Soap\Result(phpType = "string")
     */

    public function helloAction($name)
    {
        return sprintf('Hello %s!', $name);
    }
 
    /**
     * @Soap\Method("goodbye")
     * @Soap\Param("name", phpType = "string")
     * @Soap\Result(phpType = "string")
     */

    public function goodbyeAction($name)
    {
        return $this->container->get('besimple.soap.response')->setReturnValue(sprintf('Goodbye %s!', $name));
    }
}

теперь мне нужно принять строку текста, занести ее в базу и вернуть id этой сохраненной строки
Вопрос в том что я не понимаю где принмать строку? В контроллере? Откуда ее принимать? То есть я понимаю так. Нужно в фале AcmeDemoBundle/Resources/config/routing.yml прописать маршрут

acme_demo_homepage:
    path:     /hello/{name}
    defaults: { _controller: AcmeDemoBundle:Demo:index }

в адресной строке браузера прописать soap.test/hello/name, принять в контроллере. В контроллере занести в базу и вернуть return new Response($name);  Или я не так понимаю. Помогите пожалуйста разобраться, очень надо. Мне очень важно разобраться, а спросить к сожаление не у кого. Заранее спасибо.

Re: Soap сервис

По всей видимости Вы не понимаете SOAP default/smile
Посмотрите на формат SOAP запросов
https://ru.wikipedia.org/wiki/SOAP

Есть же у вас helloAction и goodByAction, в которых и показано как принимать аргументы, и как возвращаться респонзы

9

Re: Soap сервис

Вроде все стало работать. Вроде бы.... Подскажите последний раз как протестить я чего то не совсем понимаю как отправить запрос?
Код контроллера:

<?php
 
namespace Acme\DemoBundle\Controller;
 
use Acme\DemoBundle\Entity\Users;
use BeSimple\SoapBundle\ServiceDefinition\Annotation as Soap;
use Symfony\Component\DependencyInjection\ContainerAware;
 
class DemoController extends ContainerAware
{
    /**
     * @Soap\Method("hello")
     * @Soap\Param("name", phpType = "string")
     * @Soap\Result(phpType = "string")
     */

    public function helloAction($name)
    {
        $entity = new Users();
 
        $em = $this->getDoctrine()->getManager();
        $entity->setUserName($name);
        $id = $entity->getId();
        $em->persist($entity);
        $em->flush();
        return $this->container->get('besimple.soap.response')->setReturnValue(sprintf('Goodbye %s!', $name));
    }
}

каким образом отправить запрос который посылается в helloAction($name)?
soap.test/hello/name? так?
или как то по другому?
И еще вопрос как сохранить в базу и как извлечь id сохранненого поля? Глупый вопрос потому, что $em = $this->getDoctrine()->getManager(); Пишет что неизвестный метов getDoctrine();
Извиняюсь за глупые вопросы.

10

Re: Soap сервис

6762632 пишет:

каким образом отправить запрос который посылается в helloAction($name)?

Вы точно уверены, что понимаете, как работает SOAP? Там выше даже ссылка на википедию есть, где базовые примеры показывают, что запрос представляет собой xml-документ. И слать его нужно по адресу, который (теоретически, ибо сам бандл я не использовал и ковырять его ни времени, ни желания нет) прописан в конфигурации SOAP-бандла.

6762632 пишет:

Глупый вопрос потому, что $em = $this->getDoctrine()->getManager(); Пишет что неизвестный метов getDoctrine();

Потому что с некоторого времени в официальной Симфони принято в контроллере писать сразу так: $this->getManager().
Хотя, как по мне, Доктриновскому менеджеру в контроллере делать нечего, но это уже вопрос другой.

11 Отредактировано 6762632 (2015-06-03 23:35:55)

Re: Soap сервис

Понимаю с трудом, но хочу разобраться ибо надо. Ссылки что выше я все читал и до поста на форуме, но не совсем понимал. Не судите строго, но $this->getManager() тоже неизвестный метод. Что то я совсем не понимаю как тогда сохранить в базу входящий параметр.

<?php
 
namespace Acme\DemoBundle\Controller;
 
use Acme\DemoBundle\Entity\Users;
use BeSimple\SoapBundle\ServiceDefinition\Annotation as Soap;
use Symfony\Component\DependencyInjection\ContainerAware;
 
class DemoController extends ContainerAware
{
    /**
     * @Soap\Method("hello")
     * @Soap\Param("name", phpType = "string")
     * @Soap\Result(phpType = "string")
     */

    public function helloAction($name)
    {
        $entity = new Users();
 
        $em = $this->getDoctrine()->getManager();
        $entity->setUserName($name);
        $em->persist($entity);
        $em->flush();
        return $this->container->get('besimple.soap.response')->setReturnValue($entity->getId());
    }
}

как сохранить параметр? в базу?

12

Re: Soap сервис

6762632 пишет:

Не судите строго, но $this->getManager() тоже неизвестный метод.

А, этсамое... У вас контроллер от ContainerAware экстендится, а он вообще ни про что не знает, кроме собственно контейнера.
Либо наследуйтесь от Symfony\Bundle\FrameworkBundle\Controller\Controller и используйте $this->getDoctrine()->getManager();, либо дергайте Доктрину прямо из контейнера $this->container->get('doctrine'), что собственно и делает метод getDoctrine() в вышеуказанном контроллере.

13

Re: Soap сервис

Спасибо, так получилось, но только теперь неизвестный метод persist() )

14

Re: Soap сервис

Вы так далеко не уедете, с таким подходом.

15

Re: Soap сервис

Метод persist есть у EntityManager-а, а Doctrine - это Registry для EntityManager. Если у вас в проекте один EntityManager, то его можно получить вот так

$em = $this->container->get('doctrine')->getManager();

или так

$em = $this->contanier->get('doctrine.orm.entity_manager');

16

Re: Soap сервис

Спасибо за помощь. Остался пследний штрих. Как мне послать ответ в виде xml. По документации вроде написано так  return $this->container->get('besimple.soap.response')->setReturnValue(sprintf($id)); но ничего не возвращается.

<?php
 
namespace Acme\DemoBundle\Controller;
 
use Acme\DemoBundle\Entity\Users;
use BeSimple\SoapBundle\ServiceDefinition\Annotation as Soap;
use Symfony\Component\DependencyInjection\ContainerAware;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use BeSimple\SoapBundle\Soap\SoapHeader;
 
class DemoController extends ContainerAware
{
    /**
     * @Soap\Method("hello")
     * @Soap\Param("name", phpType = "string")
     * @Soap\Result(phpType = "string")
     */

    public function helloAction($savestring)
    {
 
        $entity = new Users();
        $em = $this->container->get('doctrine')->getManager();
        $entity->setUserName($savestring);
        $em->persist($entity);
        $em->flush();
        $id = $entity->getId();
 
        return $this->container->get('besimple.soap.response')->setReturnValue(sprintf($id));
    }
}

17

Re: Soap сервис

Зачем вам

sprintf($id)

, достаточно будет просто $id

И у меня вопрос, а как вы это тестите сейчас?

18

Re: Soap сервис

Тестирую чере плагин https://chrome.google.com/webstore/deta … cm/related