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 :

[UserBundle] Utilisation avec la PR7


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Points : 67
    Points
    67
    Par défaut [UserBundle] Utilisation avec la PR7
    Salut les experts !

    je reviens pour une nouvelle mésaventure, j'essaye d'adapter le UserBundle qui est à première vu pas fait pour la version PR7.
    Je pense qu'il doit y avoir un moyen de l'adapter après plusieurs problème de configuration enfin résolus j'arrive à l'erreur suivante :
    Fatal error: Class FOS\UserBundle\Entity\UserManager contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Symfony\Component\Security\Core\User\UserProviderInterface::loadUserByAccount) in C:\wamp\www\MyProject\src\FOS\UserBundle\Entity\UserManager.php on line 13
    En cherchant un peu sur le net j'ai trouvé que se serait donc un problème de compatibilité.
    Alors voila je poste mon problème en espérant que quelqu'un a réussi à l'adapter ou alors que certain on déjà cherché dans le même sens et aurai des pistes pour progresser...

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    visiblement t'as pas déclaré la méthode loadUserByUsername

  3. #3
    Membre éclairé
    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
    Points : 658
    Points
    658
    Par défaut
    Salut,

    De quel UserBundle parles tu? il y a déjà eu pas mal de versions.

    La dernière se trouve sur github : https://github.com/FriendsOfSymfony/UserBundle
    Maintenant, je n'ai pas vraiment joué avec mais l'installation se trouve la : https://github.com/FriendsOfSymfony/.../doc/index.rst

    As tu essayé de jouer avec la sécurité de base et avec une entité classique?
    Par exemple; je vois que tu utilises directement un provider. As tu essayé de baser tout simplement sur Symfony\Component\Security\Core\User\UserInterface ?
    Un petit si la réponse convient. Merci.

  4. #4
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Points : 67
    Points
    67
    Par défaut
    J'ai mis la dernière version re-téléchargé hier.

    J'ai pas encore trop farfouillé dans les options de sécurité pour l'instant ma config ressemble à ça :

    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
    security:
            providers:
                fos_userbundle:
                    id: fos_user.user_manager
            firewalls:
                main:
                    form_login:
                        provider: fos_userbundle
     
    fos_user:
            db_driver: orm
            provider_key: fos_userbundle
            class:
                model:
                    user: FOS\UserBundle\Model\User
                    group: FOS\UserBundle\Entity\DefaultGroup
    J'ai essayé avec à la place du modèle user de userbundle de mettre le mien ça ne fonctionne pas non plus toujours la même erreur.
    J'ai essayer de déclarer la méthode qu'il me demande et j'ai un autre message d'erreur me disant qu'elle n'est pas compatible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Entity/UserManager.php
     
        public function loadUserByAccount(AccountInterface $account)
        {
            if (!$account instanceof $this->class) {
                throw new UnsupportedAccountException(sprintf('Instances of "%s" are not supported.', get_class($account)));
            }
     
            return $this->loadUserByUsername($account->getUsername());
        }

    Erreur :

    Fatal error: Declaration of FOS\UserBundle\Entity\UserManager::loadUserByAccount() must be compatible with that of Symfony\Component\Security\Core\User\UserProviderInterface::loadUserByAccount() in C:\wamp\www\MyProject\src\FOS\UserBundle\Entity\UserManager.php on line 13

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    faut refaire la meme chose je vois pas ce que tu comprends pas dans "must be compatible"

    pourquoi avoir fait : AccountInterface $account, dans l'interface y'a pas de type, donc fait pareil.

    montre ta classe entière

  6. #6
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Points : 67
    Points
    67
    Par défaut
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    <?php
     
    namespace FOS\UserBundle\Entity;
     
    use Doctrine\ORM\EntityManager;
    use FOS\UserBundle\Model\UserInterface;
    use FOS\UserBundle\Model\UserManager as BaseUserManager;
    use FOS\UserBundle\Util\CanonicalizerInterface;
    use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
    use Symfony\Component\Validator\Constraint;
     
    class UserManager extends BaseUserManager
    {
        protected $em;
        protected $class;
        protected $repository;
     
        /**
         * Constructor.
         *
         * @param EncoderFactoryInterface $encoderFactory
         * @param string                  $algorithm
         * @param CanonicalizerInterface  $usernameCanonicalizer
         * @param CanonicalizerInterface  $emailCanonicalizer
         * @param EntityManager           $em
         * @param string                  $class
         */
        public function __construct(EncoderFactoryInterface $encoderFactory, $algorithm, CanonicalizerInterface $usernameCanonicalizer, CanonicalizerInterface $emailCanonicalizer, EntityManager $em, $class)
        {
            parent::__construct($encoderFactory, $algorithm, $usernameCanonicalizer, $emailCanonicalizer);
     
            $this->em = $em;
            $this->repository = $em->getRepository($class);
     
            $metadata = $em->getClassMetadata($class);
            $this->class = $metadata->name;
        }
     
        /**
         * {@inheritDoc}
         */
        public function deleteUser(UserInterface $user)
        {
            $this->em->remove($user);
            $this->em->flush();
        }
     
        /**
         * {@inheritDoc}
         */
        public function getClass()
        {
            return $this->class;
        }
     
        /**
         * {@inheritDoc}
         */
        public function findUserBy(array $criteria)
        {
            return $this->repository->findOneBy($criteria);
        }
     
        /**
         * {@inheritDoc}
         */
        public function findUsers()
        {
            return $this->repository->findAll();
        }
     
        /**
         * {@inheritDoc}
         */
        public function updateUser(UserInterface $user)
        {
            $this->updateCanonicalFields($user);
            $this->updatePassword($user);
     
            $this->em->persist($user);
            $this->em->flush();
        }
     
        /**
         * {@inheritDoc}
         */
        public function validateUnique($value, Constraint $constraint)
        {
            $fields = array_map('trim', explode(',', $constraint->property));
            $users = $this->findConflictualUsers($value, $fields);
     
            // there is no conflictual user
            if (empty($users)) {
                return true;
            }
     
            // there is no conflictual user which is not the same as the value
            if ($this->anyIsUser($value, $users)) {
                return true;
            }
     
            return false;
        }
     
        /**
         * Indicates whether the given user and all compared objects correspond to the same record
         *
         * @param UserInterface $user
         * @param array $comparisons
         * @return boolean
         */
        protected function anyIsUser($user, array $comparisons)
        {
            foreach ($comparisons as $comparison) {
                if (!$user->isUser($comparison)) {
                    return false;
                }
            }
     
            return true;
        }
     
        /**
         * Gets conflictual users for the given user and constraint
         *
         * @param UserInterface $value
         * @param array $fields
         * @return array
         */
        protected function findConflictualUsers($value, array $fields)
        {
            return $this->repository->findBy($this->getCriteria($value, $fields));
        }
     
        /**
         * Gets the criteria used to find conflictual entities
         *
         * @param UserInterface $value
         * @param array $constraint
         * @return array
         */
        protected function getCriteria($value, array $fields)
        {
            $classMetadata = $this->em->getClassMetadata($this->class);
     
            $criteria = array();
            foreach ($fields as $field) {
                if (!$classMetadata->hasField($field)) {
                    throw new \InvalidArgumentException(sprintf('The "%s" class metadata does not have any "%s" field or association mapping.', $this->class, $field));
                }
     
                $criteria[$field] = $classMetadata->getFieldValue($value, $field);
            }
     
            return $criteria;
        }
     
        public function loadUserByAccount($account)
        {
            if (!$account instanceof $this->class) {
                throw new UnsupportedAccountException(sprintf('Instances of "%s" are not supported.', get_class($account)));
            }
     
            return $this->loadUserByUsername($account->getUsername());
        }
    }

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    loadUserByUsername il est ou ?

  8. #8
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Points : 67
    Points
    67
    Par défaut
    Il est dans Model/UserManager.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        public function loadUserByUsername($username)
        {
            $user = $this->findUserByUsername($username);
     
            if (!$user) {
                throw new UsernameNotFoundException(sprintf('No user with name "%s" was found.', $username));
            }
     
            return $user;
        }

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    ok je vois, ca m'apprendra a rester sur le git, la ou loadUserByAccount n'existe pas, il faut bien mettre le AccountInterface mais
    tu dois mettre sont namespace

    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    use Symfony\Component\Security\Core\User\AccountInterface;

  10. #10
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Points : 67
    Points
    67
    Par défaut
    Si je la redéfini dans Model/UserManager.php il me met la même erreur mais cette fois avec le chemin vers Model.
    La méthode aurai était supprimé de symfony 2 y a une semaine c'est ça qui poserai problème.

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    oui il faut aussi modifier le UserManager.php pour qu'il soit compatible

  12. #12
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Points : 67
    Points
    67
    Par défaut
    Ok a fonctionne j'ai plus la même erreur maintenant j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Declaration of FOS\UserBundle\Security\Encoder\EncoderFactory::getEncoder() must be compatible with that of Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface::getEncoder() in C:\wamp\www\MyProject\src\FOS\UserBundle\Security\Encoder\EncoderFactory.php on line 23
    Vais continuer à chercher...
    En tous cas merci beaucoup stealth35 !!

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    ca doit être pareil regarde bien les namespaces du AccountInterface

  14. #14
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Points : 67
    Points
    67
    Par défaut
    Bon j'ai pas corrigé cette erreur mais j'ai un collègue qui a regardé et au final ça pointerai sur une classe inexistante de symfony 2 qui a été supprimé il n'est donc vraiment pas compatible...

  15. #15
    Membre éclairé
    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
    Points : 658
    Points
    658
    Par défaut
    perso, je me suis créé un userbundle très simple; c'est plus rapide et ca permet de mieux comprendre ce qu on fait.
    Un petit si la réponse convient. Merci.

  16. #16
    Membre éclairé
    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
    Points : 658
    Points
    658
    Par défaut
    Voici mon bundle méga-simple, cela donne une idée de comment utiliser.

    En fait je défini une classe user de base dans UserBundle (ainsi qu'un controller)

    Ensuite dans mon bundle d'application en cours; je fais de simple extends... et pif paf boum; ca fonctionne.

    Evidement; aucune comparaison avec le FOSUSerbundle...

    Il faut ajouter la création d'utilisateur, etc.... mais l'idée est la pour comprendre.

    Pour les configs correspondantes:

    config.yml =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    doctrine:
        orm:
            auto_generate_proxy_classes: %kernel.debug%
            default_entity_manager: default
            entity_managers:
                default:
                    connection: default
                    mappings:
                        AppBundle: { type: annotation, dir: Entity/}
                        UserBundle: { type: annotation, dir: Entity/}
    routing.yml =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    app:
        resource: @AppBundle/Resources/config/routing.yml
     
    _welcome:
        pattern:  /
        defaults: { _controller: AppBundle:Demo:index }
    Et le reste se trouve dans les bundles du zip.
    Fichiers attachés Fichiers attachés
    Un petit si la réponse convient. Merci.

  17. #17
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Points : 67
    Points
    67
    Par défaut
    Merci RapotOR !

  18. #18
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 107
    Points : 67
    Points
    67
    Par défaut
    Bon finalement je continu ce post car j'ai du nouveau !

    En essayant de faire un UserBundle moi même je me suis rendu compte que la classe qui avait disparu avait enfaite plus ou moins changé de nom elle ne s'appelle donc plus "AdvancedUserInterface" mais "AccountInterface" (toujours pas précisé dans la doc) j'ai donc implémenté partout où ça manquaient je me dit ça y est je vais peut être réussir à l'intégrer !

    Mais non je tombe sur une erreur que je ne comprend pas de nouveau...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Uncaught exception 'LogicException' with message 'Circular reference detected for service "security.context" (services currently loading: routing.loader.real, assetic.asset_manager, twig, security.context, security.authentication.manager, fos_user.user_manager, profiler, data_collector.security).' in C:\wamp\www\MyProject\app\bootstrap.php on line 103
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LogicException: Circular reference detected for service "security.context" (services currently loading: routing.loader.real, assetic.asset_manager, twig, security.context, security.authentication.manager, fos_user.user_manager, profiler, data_collector.security). in C:\wamp\www\MyProject\app\bootstrap.php on line 103

  19. #19
    Membre éclairé
    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
    Points : 658
    Points
    658
    Par défaut
    heu... non! tu dois avoir une ancienne version.

    C'est "UserInterface" ou la version Advanced...

    AccountInterface est un vieux bazard!
    Un petit si la réponse convient. Merci.

  20. #20
    Futur Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 4
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par RapotOR Voir le message
    heu... non! tu dois avoir une ancienne version.

    C'est "UserInterface" ou la version Advanced...

    AccountInterface est un vieux bazard!
    Pourtant j'ai aussi lu que c'etait bien l'inverse : UserInterface in Symfony2 PR7

Discussions similaires

  1. Application utilisable avec plusieurs SGBD - ADO ou DBX ?
    Par RamDevTeam dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/12/2004, 08h25
  2. Réponses: 10
    Dernier message: 30/11/2004, 10h12
  3. [LG]Connaitre l'OS utilisé avec Pascal
    Par Ilove dans le forum Langage
    Réponses: 17
    Dernier message: 05/02/2004, 20h51
  4. problème d'utilisation avec turbo pascal 7.0
    Par le 27 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 03/12/2003, 10h44
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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