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 :

security.context dans le FindAll() d'une table jointe [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre confirmé Avatar de khand
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2008
    Messages : 120
    Par défaut security.context dans le FindAll() d'une table jointe
    Bonjour,

    Comment peut-on surcharger la fonction FindAll() d'une entité en relation OneToMany ? Surcharger l'appel du repository de l'autre classe je veux dire ...

    J'aimerais ajouter une paramètre (le security.context) à la fonction findAll() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $em->getRepository('CaCardBundle:Departement')->findAll(security_context);
    Mais l'appel se fait tout seul a cause de la relation OneToMany.

    Merci

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383

  3. #3
    Membre confirmé Avatar de khand
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2008
    Messages : 120
    Par défaut
    Merci !

    Mais...comment je fais pour modifier la méthode findAll() en findAll(security.context) ? La redéfinition, pas de problème. Mais lorsque la fonction sera automatiquement appelé par symfony, je ne peux lui donner le paramêtre voulu. Je n'ai pas accès à l'appel de ma nouvelle méthode findAll(security.context) ! (Dans le cas d'une relation OneToMany et pour la table en "Many" lors de la création d'une nouvelle entité de la table "One").

    Tu me suis ? Si besoin je prends un exemple concret

    Merci de l'aide !

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    Perso je ne comprends pas. Tu parles d'une relation OneToMany, mais aussi d'un findAll(). Cette fonction te permet simplement de te lister toutes les entités, pas les entités d'une relation.

    Je te conseillerais de faire un petit service "MySecurity", où tu gères çà à la main et où tu peux facilement manipuler le security.context.
    Parce qu'en plus niveau code, je ne pense pas que la gestion de sécurité est à sa place dans un repository.

  5. #5
    Membre confirmé Avatar de khand
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2008
    Messages : 120
    Par défaut
    Bonjour,

    Oui c'est vrai que ce n'est pas vraiment sa place...maintenant voici un exemple concret.

    Prenons une table client et une table adresse. Relation OneToMany.

    Lors que je créé un nouveau client, dans mon formulaire, je vais retrouver une liste d'adresse. Ce que je veux faire, c'est : en fonction du client connecté sur le site, ne proposer que des adresse se trouvant dans la ville indiqué dans la table client. Et donc dépendant du client connecté. Ainsi chaque personne qui va se connecter, ne verra dans sa liste d'adresse que des adresses qu'il "connait".

    C'est un peu plus clair ? :s

    Donc je veux modifier la fonction findAll() de la l'entité adresse pour qu'elle prenne en compte le client connecté.

    MERCHI

  6. #6
    Membre éclairé
    Profil pro
    IED Web
    Inscrit en
    Octobre 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : IED Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 60
    Par défaut
    De un, si tu as besoins de faire des requêtes dans ton repository Departement avec des informations de l'utilisateur connecté, il est inutile de passer tout le securityContext, il faut une méthode un peu plus spécifique du style :
    findAllDepartementByUtilisateur(Utilisateur $user);
    Et tu ne passera donc pas tout le securityContext mais seulement l'objet Utilisateur. cf. [securityContext]->getToken()->getUser()


    De deux, depuis une classe formulaire, oui tu n'as pas accès au securityContext, pas plus qu'à l'entityManager par défaut.

    Il faut, dans ta classe formulaire XXXType:

    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
        public function getDefaultOptions(array $options)
        {
            return array(
                'em' => 'Doctrine\ORM\EntityManager',      // Inutile si utilisation d'un entity avec querybuilder comme dans la suite
                'sc' => 'Symfony\Component\Security\Core\SecurityContext'    // Peut être restreint à l'objet user ou plus precis si pas besoin de conditions d'autorisations par exemple
            );
        }
     
        public function buildForm(FormBuilder $builder, array $options)
        {
            $sc = $options['sc'];
     
            $builder->[...]
                    ->add('adresses', 'entity', array(
                        'class' => '[...]\\Entity\\Departement',
                        'query_builder' => function ([...]\Repository\DepartementRepository $repository) use ($sc) {
                            return $repository->findAllAdressesByUtilisateur($sc->getToken->getUser());
                        }
                    ))
    Si le code marche pas en l'état parce que y'a un truc que j'ai oublié, tu as 99% de l'idée.

  7. #7
    Membre confirmé Avatar de khand
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2008
    Messages : 120
    Par défaut
    Bonjour,

    Merci pour ta réponse. Le premier point; tout à fait d'accord, et c'est bien ce que je fais. Je parlais de FindAll() juste pour l'explication

    Le deuxième point contient exactement l'élément de réponse que j'attendais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    'query_builder' => function ([...]\Repository\DepartementRepository $repository) use ($sc) {
                            return $repository->findAllAdressesByUtilisateur($sc->getToken->getUser());
    }
    J'avoue avoir eu du mal à l'expliquer

    Merci et bonne journée !

  8. #8
    Membre éclairé
    Profil pro
    IED Web
    Inscrit en
    Octobre 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : IED Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 60
    Par défaut
    De rien. Bonne journée également!

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

Discussions similaires

  1. Recherche dans plusieurs colonnes d'une table
    Par yoline dans le forum Access
    Réponses: 4
    Dernier message: 26/07/2006, 11h58
  2. Recherche dans plusiuers colonnes d'une table
    Par yoline dans le forum Access
    Réponses: 3
    Dernier message: 25/07/2006, 13h00
  3. Réponses: 4
    Dernier message: 08/07/2006, 06h36
  4. Désactiver saisie dans un input d'une table
    Par dehbi dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 21/03/2006, 18h11
  5. Lire un code à barre dans un champ d'une table
    Par tleboukaka dans le forum Débuter
    Réponses: 1
    Dernier message: 05/09/2005, 15h15

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