Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 01-02-2012 23:37:22

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Doctrine 2 et ZF2

Bonsoir, je suis actuellement en train de faire des tests d'utilisation de Doctrine 2 un peu plus poussés.

- J'ai généré la base de données à partir de mes entités annotés.
- J'ai généré les classes de proxy

Voici mes entités :

Code:

[lang=php]
namespace Album\Entity;

use Doctrine\ORM\Mapping as ORM,
    \Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 */
class Membre {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=40)
     */
    private $login;

    /**
     * @ORM\ManyToOne(targetEntity="Alliance", inversedBy="membres")
     */
    private $alliance;

    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

...

    public function getAlliance() {
        return $this->alliance;
    }

    public function setAlliance($alliance) {
        $this->alliance = $alliance;
    }

Code:

[lang=php]
namespace Album\Entity;

use Doctrine\ORM\Mapping as ORM,
    \Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 */
class Alliance {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="Membre", mappedBy="alliance")
     */
    private $membres = null;

    public function __construct() {
        $this->membres = new ArrayCollection();
    }

    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function getMembres() {
        return $this->membres;
    }

    public function addMembre($membre) {
        $this->membres[] = $membre;
    }

Jusque là tout va bien, je suis capable de récupérer une entité Membre et/ou une entité Alliance à partir du repository par defaut de l'Entity Manager.

Maintenant lorsque je souhaite accéder aux données à travers le lazyloading j'ai des problèmes un peu bizarres.

Voici mon code de test

Code:

[lang=php]
$membres = $this->em->getRepository('Album\Entity\Membre')->findAll(); // Récupère la liste des membres

foreach ($membres as $membre) {
            $alliance = $membre->getAlliance(); // fonctionne très bien
            var_dump($alliance->getMembres()); // fonctionne très bien
            var_dump($alliance->getId()); // fonctionne mal [1]

            $membresAlly = $alliance->getMembres(); // fonctionne mal [2]
            // dans mon exemple j'ai qu'un seul membre dans mon objet $membreAlly
            $membreSeul = $membresAlly[0]; // fonctionne toujours
            var_dump($membreSeul->getLogin()); // fonctionne bien mais bizarre [3]
        }

Je détail les 2 points qui fonctionnent mal.
[1] La valeur présente dans l'attribut "id" de mon objet Alliance est retourné : "int 1". Par contre j'ai une erreur juste m'indiquant ceci : Fatal error: Call to a member function getId() on a non-object in E:\PHP\quickstartzf2\module\Album\src\Album\Controller\AlbumController.php on line 20 et la ligne 20 c'est la ligne [1]

[2] Même problème, lorsque je veux récupérer les membres d'une alliance j'ai un problème similaire au [1] : Fatal error: Call to a member function getMembres() on a non-object in E:\PHP\quickstartzf2\module\Album\src\Album\Controller\AlbumController.php on line 22.
[3] Le var_dump m'affiche : "string 'Orkin' (length=5)" alors qu'il me dit que je n'ai pas pu récupérer l'ArrayCollection présent dans l'objet Alliance, c'est quand même étrange

J'ai tenté d'appeler une méthode qui n'existe pas dans mon objet et PHP me dit bien que j'appelle une méthode qui n'existe pas sur l'objet : Fatal error: Call to undefined method Album\Entity\Membre::getLogiscscn() in E:\PHP\quickstartzf2\module\Album\src\Album\Controller\AlbumController.php on line 24

Si je fais var_dump($membreSeul->getAlliance()); je n'ai plus une seul message et il me retourne bien un objet de type proxy : DoctrineORMModule\Proxy\AlbumEntityAllianceProxy
Mes proxys surchargent bien mes getters/setters ...

Du coup je suis un peu perdu. C'est vraiment très curieux :s

Sinon j'ai un soucis au niveau des accents et je souhaiterais forcer le mode UTF8 dans les paramètres de doctrine 2 quelqu'un sait où l'indiquer au niveau du fichier de configuration du module ?

Dernière modification par Orkin (01-02-2012 23:39:48)

Hors ligne

 

#2 02-02-2012 09:31:14

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Doctrine 2 et ZF2

Bonjour, j'ai trouvé un début de solution pour les erreurs PHP étranges, il semble que la version de PHP que j'utilisais étais un peu vieille, sur la 5.3.5 je n'ai plus le problème.

Je poursuis mes recherches pour le passage en utf8 au niveau des requêtes.

Hors ligne

 

#3 02-02-2012 09:42:43

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Doctrine 2 et ZF2

Voici la solution pour activer l'utf8 sous Doctrine 2 et ZF2.

Dans le fichier de configuration module.doctrine_orm.config.php il faut rajouter dans le tableau présent sous la clé "connection" ces 2 paramètres (juste après dbname) :

Code:

[lang=php]
'charset' => 'utf8',
'driverOptions' => array (1002 => 'SET NAMES utf8'),

Dernière modification par Orkin (02-02-2012 09:43:03)

Hors ligne

 

#4 18-04-2012 10:06:15

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Doctrine 2 et ZF2

Bonjour, j'ai de nouveau une problématique sous doctrine 2.

Voici un petit récapitulatif de mon schema de base de données (je pars du principe que mes annotations sont correctes) :

Table Article

Code:

id
code
prix

Table Pays

Code:

id
code
nom

Table DescriptionArticle

Code:

id_pays
id_article
description

J'explique maintenant à quoi ça correspond. J'ai une liste d'article qui peuvent être vendu suivant le pays où réside l'utilisateur. J'ai donc dans mon Entité Utilisateur une référence vers le pays ($utilisateurEntity->getPays()wink. La table DescriptionArticle permet de savoir dans quel pays est disponible l'article et d'avoir une description de celui-ci en fonction du pays (pour adapter la langue) de ce fait un même article disponible en france et en angleterre sera 2 fois présent dans la table avec une description en francais et une autre en anglais.

Pour récupérer facilement la liste des DescriptionArticle disponibles par pays ça reste assez simple, je pars de l'entité pays et je liste les articles disponible. Un article ne pouvant être qu'une fois présent par pays je peux récupérer facilement l'entité Article puisqu'il n'y a qu'une référence dans ce sens entre DescriptionArticle et Article.

Maintenant mon soucis c'est de faire l'inverse. Un utilisateur a commandé 3 article et il souhaite consulter son panier. J'ai donc connaissance que de l'article, ce que j'aimerai pouvoir faire c'est depuis mon entité Article récupérer sa description. En temps normal, si un article est disponible dans plusieurs pays je devrais récupérer une ArrayCollection de DescriptionArticle en faisant ($articleEntité->getDescriptionArticle()wink.
Ce que j'aimerai maintenant c'est pouvoir récupérer la description en fonction du pays de l'utilisateur un peu comme si on pouvait faire ça :
$articleEntité->getDescriptionArticle($utilisateurEntité->getPays()); (on peut passer uniquement le code ou l'id du pays ça change pas grand chose au final). Le problème c'est que de cette façon ça impose à mon entité Article d'avoir accès à l'entityManager et de faire des traitement or ces classes ne sont pas faites pour ça.

Je pourrais passer par la classe Repository qui prend en paramètre l'entité Pays puis faire le traitement à l'intérieur sauf que ça ne me semble pas naturel puisque j'aimerai rendre ceci disponible directement depuis mon entité.

Si quelqu'un a une solution ou peux m'indiquer quelle chemin prendre je l'en remercie ^^.

Orkin

Hors ligne

 

#5 18-04-2012 12:20:37

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: Doctrine 2 et ZF2

Bon, je récapitule la situation :

Article - 1...n  ---- disponible  ---- 0...n - Pays
Utilisateur - 1.1 ---- a ---- 1.1 - Panier
Panier - 0...n ---- contient ---- 0...n - Article

On a donc (ce que je note # sont des clés étrangères et ce qui est souligné est une clé primaire) :

Article (id, code)
Pays (id, code, nom)
ArticlePays(#id_article, #id_pays, description, prix)
Panier (#id_utilisateur, #id_article)

Ce que tu peux faire, c'est que quand tu annotes ton entité Article. Plutôt que d'avoir une relation @ManyToMany dans ton entité article, c'est de t'inspirer du Use Case 3 de la doc : http://docs.doctrine-project.org/en/lat … -keys.html

Tu aurais donc :

Code:

class Article
{
     @OneToMany(target="ArticlePays")
     private $descriptions;
}

class Pays
{
    
}

class ArticlePays
{
     @Id, @ManyToOne(target="Article")
     private $article;

     @Id, @ManyToOne(target="Pays")
     private $pays;

     private $description;
}

Sinon, essaye de regarder de ce côté là aussi : http://readthedocs.org/docs/doctrine-or … ht=indexby

J'ai jamais utilisé mais peut-être que ça pourrait être intéressant.

Hors ligne

 

#6 18-04-2012 14:36:46

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Doctrine 2 et ZF2

Ok j'ai testé ta première solution ça m'a l'air pas mal dans le sens où je sais comment faire des clés sur plusieurs champs (j'avais jamais réussi ça plantait toujours ...) mais ça ne règle pas le problème en lui même. Puisque à partir de l'article si je récupère ArticlePays je vais avoir une ArrayCollection de ArticlePays pour chaque pays pour lequel mon article est disponible.
A partir de mon article je n'ai pas moyen d'avoir uniquement un articlePays en fonction du pays.

Hors ligne

 

#7 18-04-2012 17:14:55

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: Doctrine 2 et ZF2

Il te faudra itérer à travers ta liste de ArticlePays et comparer avec l'id du pays. Tu as regardé le coup du indexBy ? Encore une fois je sais pas du tout comment ça fonctionne, mais peut-être que justement ça permet d'indexer un tableau pour un indice ? (ton pays, par exemple)

Hors ligne

 

#8 18-04-2012 21:43:42

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Doctrine 2 et ZF2

Non j'ai pas regardé ça me parle pas trop en fait. Je vais faire un peu différemment du coup. Je vais créer un objet métier qui représentera mon article avec la description dans la bonne langue que je récupèrerais via ma couche service et les repositories. Ca me semble pas trop mal.

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages