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 :

Récupérer un "container" dans une classe de "repository" [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre habitué Avatar de ke2007
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 82
    Points : 171
    Points
    171
    Par défaut Récupérer un "container" dans une classe de "repository"
    Bonjour,

    Je souhaiterais récupérer des articles, chacun dépendant d'une catégorie, sachant que les articles de la catégorie "administration" ne soit visible que par les utilisateur ayant le droit "Super Admin" de FOSUserBundle.

    Pour cela, je souhaiterais savoir s'il était possible de récupérer un "container" dans une classe héritant de la classe "EntityRepository" ?

    Si non, quel était la meilleur façon de faire ?

    Actuellement j'ai fait ça mais ça ne fonctionne pas du tout
    (Je débute avec Symfony...)

    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
    37
    38
    39
    40
    41
    42
    43
    <?php
     
    namespace Test\SiteBundle\Repository;
     
    use Doctrine\ORM\EntityRepository;
     
    use \Symfony\Component\DependencyInjection\ContainerAwareInterface;
    use \Symfony\Component\DependencyInjection\ContainerInterface;
     
    /**
     * NewsRepository
     *
     * This class was generated by the Doctrine ORM. Add your own custom
     * repository methods below.
     */
    class NewsRepository extends EntityRepository implements ContainerAwareInterface
    {
        protected $container;
     
        public function setContainer(ContainerInterface $container = null) {
            $this->container = $container;
        }
     
        public function getLastestNews($limit = 10)
        {
            $query = $this->createQueryBuilder('n')
                    ->orderBy('n.created', 'DESC');
     
            $user = $this->container->get('security.context')->getToken()->getUser();
            if(!$user->isSuperAdmin())
                $query
                    ->select('n', 'nc')
                    ->leftJoin ('n.category', 'cn')
                    ->where ('cn.name != :name_cat')
                    ->set ('name_cat', 'Administration');
     
            if(FALSE === is_null($limit))
                $query->setMaxResults($limit);
     
            return $query->getQuery()
                    ->getResult();
        }
    }
    Je sais pas sinon si c'est très propre de passer un objet "User" dans la méthode "getLastestNews"

    Merci de votre aide

  2. #2
    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,
    Je pense que le plus simple serait d'avoir une méthode avec un parametre sur les droits d'utilisateurs:
    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
     
    //dans le repository
    public function getLastestNews($limit = 10,$withAdminCategory=true)
        {
            $query = $this->createQueryBuilder('n')
                    ->orderBy('n.created', 'DESC');
            if(!$withAdminCategory){
                $query->select('n', 'nc')
                    ->leftJoin ('n.category', 'cn')
                    ->where ('cn.name != :name_cat')
                    ->set ('name_cat', 'Administration');
            }
            if(FALSE === is_null($limit)){
                $query->setMaxResults($limit);
            }
            return $query->getQuery()
                    ->getResult();
        }
     
    //dans le controller
    $user=$this->container->get('security.context')->getToken()->getUser();
    $news=$this->getEntityManager()
                     ->getRepository('Test\SiteBundle\News')
                     ->getLastestNews(10,$user->isSuperAdmin() );
    N'ayant pas trouvé de méthode simple pour injecter un service dans un repository, j'avais procéder ainsi:
    1. utiliser une classe EntityManager personalisée (avec une propriété currentUser)
    2. créer un listener qui injecte l'utilisateur courant dans l'entityManager sur l'evenement onController
    3. récupérer l'attribut currentUser de l'entityManager dans les classes repository afin de l'utiliser dans les requêtes

    C'est un peu lourd si tu n'as que quelques requêtes à filtrer par utilisateur

    D'autre part Doctrine 2.2 propose un système de filtres personalisables
    http://docs.doctrine-project.org/pro...e/filters.html
    Donc le mieux serait d'attendre son intégration dans Symfony.

  3. #3
    Membre habitué Avatar de ke2007
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 82
    Points : 171
    Points
    171
    Par défaut
    Merci de ta réponse.

    Ouai je pense je vais faire en attendant de trouver mieux ou que les filtres dont tu parles soient implémentés

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

Discussions similaires

  1. [2.x] récupérer le container dans une classe
    Par hpnet dans le forum Symfony
    Réponses: 1
    Dernier message: 05/05/2015, 10h23
  2. Récupérer un paramètre de requête dans une class Action
    Par cherif ahmed dans le forum Struts 1
    Réponses: 0
    Dernier message: 08/02/2014, 16h57
  3. Réponses: 1
    Dernier message: 01/10/2008, 15h25
  4. [vbnet 1.1]Inserer deux simple quote sans texte dans une db
    Par ChristopheOce dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/03/2007, 08h51
  5. Réponses: 3
    Dernier message: 06/12/2006, 11h44

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