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 :

[Symfony 2.7] récupération instance doctrine dans le constructeur d'un contrôleur [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2004
    Messages : 97
    Par défaut [Symfony 2.7] récupération instance doctrine dans le constructeur d'un contrôleur
    Bonjour,

    J'ai un petit souci avec l'initialisation d'une variable.

    J'ai un controleur :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    namespace SB\FrontendBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Request;
    use Doctrine\ORM\EntityManager;
    use Mie\FrontendBundle\Entity\Product;
     
     
    class FrontendController extends Controller
    {
      protected $em;
     
      public function __construct(EntityManager $entityManager = null)
      {
        $this->em = $this->getDoctrine()->getManager(); //--->TEST 1
     
        $this->em = $entityManager; //--->TEST2
      }
     
      public function dispatchUrl(Request $request)
      {
          $this->em = $this->getDoctrine()->getManager(); //--->TEST 3
     
          $product = new Product();
          $product->setName('A Foo Bar');
          $product->setPrice('19.99');
          $product->setDescription('Lorem ipsum dolor');
     
     
          $this->em->persist($product);
          $this->em->flush();
          die();  
    }
     
    }

    j'ai un fichier service.yml dans lequel je configure le passage du service doctrine à la class FrontendController
    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
    parameters:
        mie.frontend.controller.frontend.class: Mie\FrontendBundle\Controller\FrontendController
     
    services:
    # ---> ESSAI 1
        mie.frontend.controller:
            class: "%mie.frontend.controller.frontend.class%"
            arguments:
                - "@doctrine.orm.entity_manager"
     
    # ---> ESSAI 2
        mie.frontend.controller:
            class: "%mie.frontend.controller.frontend.class%"
            arguments: [ @doctrine.orm.entity_manager ]
     
    # ---> ESSAI 3
    #    mie.frontend.controller:
    #        class: "%mie.frontend.controller.frontend.class%"
    #        calls:
    #            - [setEntityManager, ["@doctrine.orm.entity_manager"]]
    Le TEST 1 ne fonctionne pas
    Le TEST 2 avec les ESSAI 1,2,3 (services.yml) ne fonctionne pas
    Le TEST 3 fonctionne


    Avec le TEST 1, j'obtiens l'erreur
    Error: Call to a member function has() on null
    in vendor\symfony\symfony\src\Symfony\Bundle\FrameworkBundle\Controller\Controller.php at line 291

    Avec le TEST 2
    $entityManager (l'argument de la fonction __construct) est null

    Je n'ai pas trouvé de contre-indication quant à l'initialisation, dans le controller, d'une variable contenant une instance de l'entitymanager.
    Avec Symfony2.3, le test 2 fonctionnait, il me semble.

    Est-ce qu'il y a quelque chose d'autre à configurer au niveau du service doctrine ?



    merci,
    Phil

  2. #2
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut
    A mon avis, tu peux retirer tout ton code et faire simplement ca dans ton controleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->getDoctrine()->getManager()

  3. #3
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2004
    Messages : 97
    Par défaut
    oui,
    ceci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $em = $this->getDoctrine()->getManager();
    Pour que le TEST 2 fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class FrontendController extends Controller
    {
      protected $em;
     
      public function __construct(EntityManager $entityManager = null)
      {
        $this->em = $entityManager; //--->TEST2
      }
    ...
    Dans les routes, il faut appeler le contrôleur comme un service

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    default:
        path: /{url}
        defaults: { _controller: mie.frontend.controller:dispatchUrl }
        requirements:
            url: .*[/]{0,1}$
        methods: [GET]
    à la place de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    default:
        path: /{url}
        defaults: { _controller: Mie\FrontendBundle\Controller\FrontendController::dispatchUrl }
        requirements:
            url: .*[/]{0,1}$
        methods: [GET]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 16
    Dernier message: 10/11/2005, 21h10
  2. Réponses: 6
    Dernier message: 23/10/2005, 12h24
  3. Récupération de valeurs dans logiciel de bourse
    Par david0280 dans le forum MFC
    Réponses: 25
    Dernier message: 28/03/2005, 20h28
  4. récupération de données dans un TDBControlGrid
    Par dableuf dans le forum Bases de données
    Réponses: 3
    Dernier message: 22/11/2004, 14h25
  5. Récupération d'index dans DBLookupControl ?
    Par Michel D. dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/06/2004, 15h01

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