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

Doctrine2 PHP Discussion :

Appel de Doctrine à partir d'un service


Sujet :

Doctrine2 PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Par défaut Appel de Doctrine à partir d'un service
    Bonjour,
    Je suis débutant sur Symfony2.
    J'ai un problème de compréhension :

    Controller:

    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
    <?php
    namespace claude\TeletravailBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\Httpfoundation\Response;
     
    class TeletravailController extends Controller
    {
        public function accueilAction($page)
        {
    		// Mise à jour des compteurs
    		// On récupère le service
     
    		$compteur = this->container->get('claude_Teletravail.compteur');
     
    		// Affichage du Template accueil ../..
    Service : claude_Teletravail.compteur

    parameters:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # src/claude/TeletravailBundle/Resources/config/services.yml
    services:
        claude_Teletravail.compteur:
              class: claude\TeletravailBundle\Compteur\claudecompte
    le fichier visiteurs utilisé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
     
    namespace claude\TeletravailBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * visiteurs
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="claude\TeletravailBundle\Entity\visiteursRepository")                                             
     */
    class visiteurs
    {                                      .. et les zones ..
    visiteursRepository :

    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
    <?php
     
    namespace claude\TeletravailBundle\Entity;
     
    use Doctrine\ORM\Mapping\ClassMetadata;
    use Doctrine\ORM\EntityRepository;
     
    /**
     * visiteursRepository
     * 
     */
    class visiteursRepository extends EntityRepository
    {
    	private $visiteur;
    	private $date;
    	private $page;
     
    	public function nbrvisit($visiteur, $page)
    	{
    		$qb = $this->createQueryBuilder('v');
     
    		$qb->where('v.ip = :ip')
    		   ->setParameter('ip', $visiteur)
    		   ->andwhere('v.date = :date')
    		   ->setParameter('date', currentdate())
    		   ->andwhere('v.page = :page')
    		   ->setParameter('page', $page);
     
    		return $qb->getQuery()->getSingleScalarResult()
    		          ->getResult();
    	}
    }
    Appel du Repository :

    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
    <?php
    namespace claude\TeletravailBundle\Compteur;
     
    use Doctrine\ORM\EntityRepository;
     
    class claudecompte extends EntityRepository
    {
     
     public function __construct($em, Mapping\ClassMetadata $class)
    {
            $this->_entityName = $class->name;
            $this->_em         = $em;
    }
     
     public function comptage()
      {	
    	// Récupération de l'IP du visiteur
    	$visiteur = $this->get_ip();				
    	$visiteur = ip2long($visiteur);	
     
    	// Adresse de la page
    	$page = substr($_SERVER['PHP_SELF'], 1);	
     
    	// Appel de la fontion "nbrvisit" qui est sensée faire un comptage
     
    	$retour_count = $this->getDoctrine()
    				     ->getManager()
    				    ->getRepository('claudeTeletravailBundle:visiteurs')
    	                            ->nbrvisit($visiteur, $page);
    2 problèmes : si je ne mets pas le _const ==> paramètre 1 de _const manquant (fatal error)
    si je le mets : la méthode pour Doctrine doit être Findby...

    Doctrine est un service. On peut donc appeler de n'importe où. Est-ce qu'il y a une particularité lorsque l'on ne l'appelle pas via le Controller ?

    Merci d'avance...

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Par défaut
    un service n'est aps appelé n'importe, mais peut être injecter n'importe ou, c'est très différent.
    La tu injecte l'entity manager $em, alors utilise le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public function comptage()
      {	
            //[...]
    	$retour_count = $this->_em
    				    ->getRepository('claudeTeletravailBundle:visiteurs')
    	                            ->nbrvisit($visiteur, $page);

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Par défaut
    Tout d'abord merci pour la réponse et sa réactivité.
    J'ai malheureusement toujours le même problème même en supprimant le cache.

    ContextErrorException: Warning: Missing argument 1 for claude\TeletravailBundle\Compteur\claudecompte::__construct(), called in C:\wamp\www\Symfony\app\cache\dev\appDevDebugProjectContainer.php on line 385 and defined in C:\wamp\www\Symfony\src\claude\TeletravailBundle\Compteur\claudecompte.php line 12

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Par défaut
    Pourquoi tu as besoin de class metadata en deuxieme argument ton service?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public function __construct($em, Mapping\ClassMetadata $class)
    Pour injecter les dépendances, dans ton service il suffit de rajouter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # src/claude/TeletravailBundle/Resources/config/services.yml
    services:
        claude_Teletravail.compteur:
              class: claude\TeletravailBundle\Compteur\claudecompte
              arguments: [@doctrine.orm.entity_manager]

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Par défaut
    Cela ne marche toujours pas...

    ContextErrorException: Catchable Fatal Error: Argument 2 passed to claude\TeletravailBundle\Compteur\claudecompte::__construct() must be an instance of claude\TeletravailBundle\Compteur\Mapping\ClassMetadata, none given, called in C:\wamp\www\Symfony\app\cache\dev\appDevDebugProjectContainer.php on line 385 and defined in C:\wamp\www\Symfony\src\claude\TeletravailBundle\Compteur\claudecompte.php line 12
    On tourne en rond avec ce genre d'erreur qui en plus n'est pas explicite.
    J'avais essayer plusieurs choses, mais je pense que je ne dois pas avoir bien compris la logique...

    merci encore pour votre aide.

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Par défaut
    si je remets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public function __construct($doctrine){
       $em = $this->getDoctrine()->getManager();
    j'obtiens :
    Undefined method 'getDoctrine'. The method name must start with either findBy or findOneBy!

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Par défaut
    Les erreurs sont très explicite, c'est juste que tu ne comprends pas ce que tu fais ^^


    si tu injectes l'entity manager:
    arguments: [@doctrine.orm.entity_manager]
    alors tu récupères un entity manager
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public function __construct($em){
       $em = $em;
    Si tu injectes tout doctrine:
    arguments: [@doctrine]
    alors tu récupères doctrine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public function __construct($doctrine){
       $em = $this->getDoctrine()->getManager();

    Pour éviter ce genre d'erreur, tu peux rajouter de la propreté a ton code en rajoutant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    use Doctrine\ORM\EntityManager;
    //[...]
    public function __construct(EntityManager $em) {
    Qui t'assurera d'avoir bien un entityManager dans ton service

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Par défaut
    Grâce à vous, un grand bon en avant a été fait.
    Je suis passé à l'appel de ma fonction "nbrvisit" et j'ai le message :

    FatalErrorException: Error: Call to a member function getRepository() on a non-object in C:\wamp\www\Symfony\src\claude\TeletravailBundle\Compteur\claudecompte.php line 41
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $retour_count = $this->_em					                        ->getRepository('claudeTeletravailBundle:visiteurs')
    ->nbrvisit($visiteur, $page);
    Mais je pense qu'il s'agit d'un autre problème...

    merci pour tout.

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 178
    Par défaut
    Bonjour Claudeh27,

    Tu as notifier le problème comme résolu mais tu n'en donne pas la réponse car moi j'ai toujours le même message d'erreur. As-tu réussi à solutionner ton problème ? Merci

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/09/2014, 18h59
  2. Réponses: 6
    Dernier message: 30/09/2005, 00h53
  3. appel de fonction à partir d'une image activer/desactiver
    Par philippe123 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 23/08/2005, 16h26
  4. appeler plusieurs fonctions à partir d'une checkbox
    Par amelhog dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/05/2005, 16h10
  5. PB d'écriture sur MSSQLServer à partir d'un service
    Par Dunsany dans le forum Bases de données
    Réponses: 31
    Dernier message: 21/08/2004, 15h25

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