IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Accéder au service Doctrine en dehors du contrôleur


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 50
    Points : 37
    Points
    37
    Par défaut Accéder au service Doctrine en dehors du contrôleur
    Bonjour,

    Je suis en train de tester Symfony2 dans le cadre de la création d'un webservice SOAP.

    Voici le contrôleur suivant pour la génération du WSDL et du serveur SOAP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    namespace Pn\WebserviceBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Response;
     
    class DefaultController extends Controller {
     
        public function serverAction() {        
            $server = new \Zend_Soap_Server('http://softwares.xxxx.fr/web/app_dev.php/webservices/test');
            $server->setClass('\Pn\WebserviceBundle\Services\TestService');
            $response = new Response($server->handle());
            $response->headers->set('Content-Type', 'text/xml; charset=UTF-8');
            ob_start();
            $server->handle();
            $response->setContent(ob_get_clean());
            return $response;
        }
     
        public function wsdlAction() {
            $autodiscover = new \Zend_Soap_Autodiscover();
            $autodiscover->setClass('\Pn\WebserviceBundle\Services\TestService')
                         ->setUri('http://softwares.xxxx.fr/web/app_dev.php/webservices/test/server');  
            return new Response($autodiscover->toXml());
        }
     
    }
    Le webservice est associé à la classe TestService.

    J'aimerai dans cette classe TestService utilisé Doctrine pour accéder à ma table mais je ne vois pas comment procéder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public function getAddress($id) {          
            $repository = $this->getDoctrine()->getManager('pntest')->getRepository('PnWebservice:Address');
            $address = $repository->find($id);
            return $address->fistName;
    }
    Merci d'avance pour votre aide

  2. #2
    Membre à l'essai
    Inscrit en
    Mars 2011
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 25
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Il me semble que tu n'as pas le droit de d'y accéder depuis une entités ... C'est le "but" du MVC.

    Tu dois pouvoir trouver un moyen pour l'utiliser que depuis le controller.

    Olivier

  3. #3
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Bonjour,

    accéder à doctrine depuis une entité n'a pas de sens mais accéder à l'entity manager via un service, se fait trés bien. Cela s’appelle le DIC ou injection de dépendance. Tout service peut être injecté dans un autre service.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    pour accéder à l'entity manager dans une classe il faut tout simplement qu'il ait un attribut entityManager, que l'on va généralement injecter via le constructeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class TestService{
    protected $em;
    public function __construct($doctrine){
       $this->em=$doctrine->getManager('pntest');
    }
    public function getAddress($id) {          
            $repository = $this->em->getRepository('PnWebservice:Address');
            $address = $repository->find($id);
            return $address->fistName;
    }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     $server = new \Zend_Soap_Server('http://softwares.xxxx.fr/web/app_dev.php/webservices/test');
            $server->setClass('\Pn\WebserviceBundle\Services\TestService');
            $em=$this->getDoctrine();
            $object=new \Pn\WebserviceBundle\Services\TestService($em);
            $server->setObject($object)
            ....
    comme dis plus haut l'injection de dépendance est justement là pour faciliter ce genre de chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //Acme/MyBundle/Resources/config.xml
    <parameters>
       <parameter key="my_test_class">\Pn\WebserviceBundle\Services\TestService</parameter>
    </parameter>
    <services>
        <service id="my_test" class="%my_test_class%">
            <argument type="service" name="doctrine" />
        </service>
    </services>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     $server = new \Zend_Soap_Server('http://softwares.xxxx.fr/web/app_dev.php/webservices/test');
            $object=$this->get('my_test');//on récupére l'instance de TestService avec l'entityManager injecté
            $server->setClass(get_class($object));        
            $server->setObject($object)
            ....
    Tu peux même enregistrer ton instance de SoapServer en tant que service

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //Acme/MyBundle/Resources/config.xml
    <parameters>
       <parameter key="my_test_class">\Pn\WebserviceBundle\Services\TestService</parameter>
       <parameter key="my_soap_url">http://softwares.xxxx.fr/web/app_dev.php/webservices/test</parameter>
    <!-- avantage en mettant l'url en tant que paramètre tu vas pouvoir le redefinir trés simplement dans app/config/parameters.yml , ce qui te facilitera les passages en production -->
    </parameter>
    <services>
        <service id="my_test" class="%my_test_class%">
            <argument type="service" name="doctrine" />
        </service>
        <service id="my_soap_server" class="Zend_Soap_Server">
             <argument>%my_soap_url%</argument>
             <call method="setClass">
                 <argument >%my_test_class%</argument>
             </call>
             <call method="setObject">
                 <argument type="service" id="my_test" />
            </call>
        </service>
    </services>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            $server=$this->get('my_soap_server');//on récupère l'instance de Soap Server déjà configuré
            ....

Discussions similaires

  1. l'appli n'arrive pas a accéder au service windows
    Par dachir dans le forum Services Windows
    Réponses: 0
    Dernier message: 23/04/2010, 18h31
  2. Réponses: 0
    Dernier message: 01/09/2009, 15h25
  3. Réponses: 3
    Dernier message: 18/06/2009, 20h45
  4. Comment accèder à des services d'un executable en C#
    Par angusyoung34 dans le forum C#
    Réponses: 2
    Dernier message: 04/09/2007, 14h59
  5. [C#] Accéder à un service web via SOAP
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 5
    Dernier message: 29/05/2006, 18h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo