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 :

[5.x] entité parente utilisée à la place de l'entité fille


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Elianora la blanche
    Femme Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 102
    Par défaut [5.x] entité parente utilisée à la place de l'entité fille
    Bonjour à tou.te.s !

    j'ai créé un bundle basique pour en faire un vendor dans tous mes projets (histoire d'initialiser rapidement un nouveau projet).
    Ce bundle contient une entité User avec les champs de base (login, mdp, rôles, etc)

    J'ai ensuite créé un nouveau projet, avec ce bundle en vendor et sa propre entité User (qui extends celle du bundle) pour ajouter les champs spécifiques à mon projet (et notamment les relations).

    Sauf que le framework manipule l'entité parente (et forcément, ça ne fonctionne pas "App\Controller\UserController::articles(): Argument #1 ($user) must be of type App\Entity\User, Global\CoreBundle\Entity\User given")
    je ne peux pas simplement changer le typage de variables, car j'ai besoin de l'entité du projet pour avoir les champs spécifiques

    ça fait des heures que je tourne en rond entre ParamConverter, Routing et autres ^^

    y a -t-il une manière simple de manipuler la bonne entité ?

    voici qq fichiers qui pourraient être la source de ce mal :

    services.yaml
    Code yaml : 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
    parameters:
     
    services:
        _defaults:
            autowire: true      # Automatically injects dependencies in your services.
            autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
     
        App\:
            resource: '../src/'
            exclude:
                - '../src/DependencyInjection/'
                - '../src/Entity/'
                - '../src/Kernel.php'
                - '../src/Tests/'
     
        Global\CoreBundle\Controller\:
            resource: '../vendor/global/corebundle/src/Controller/'
            tags: ['controller.service_arguments']
        App\Controller\:
            resource: '../src/Controller/'
            tags: ['controller.service_arguments']
     
        Global\CoreBundle\Repository\UserRepository:
            tags:
                [ 'doctrine.repository_service' ]
     
        Global\CoreBundle\DataFixtures\UserFixtures:
            tags:
                [ 'doctrine.fixture.orm' ]

    security.yaml
    Code yaml : 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
    security:
        password_hashers:
            App\Entity\User:
                algorithm: auto
            Global\CoreBundle\Entity\User:
                algorithm: auto
     
        enable_authenticator_manager: true
        providers:
            app_user_provider:
                entity:
                    class: App\Entity\User
                    property: login
     
            core_bundle_user_provider:
                entity:
                    class: Global\CoreBundle\Entity\User
                    property: login
        firewalls:
            dev:
                pattern: ^/(_(profiler|wdt)|css|images|js)/
                security: false
            main:
                lazy: true
                provider: app_user_provider
                logout:
                    path: logout
                login_throttling:
                    max_attempts: 3
                custom_authenticator: App\Security\AppAuthenticator
                remember_me:
                    secret: '%kernel.secret%'
                    lifetime: 2592000 # 1 month in seconds
                    path: /
     
        access_control:
            - { path: ^/$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/articles/$, roles: IS_AUTHENTICATED_ANONYMOUSLY }


    UserController.php
    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
    <?php
     
    namespace App\Controller;
     
    use App\Entity\User;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
     
    class UserController extends AbstractController
    {
        #[Route('/articles/{user}', name: 'user_articles')]
        #[Entity('user', options: ['id' => 'user'])]
        public function articles(User $user): Response
        {
            dd($user->getArticles());
            return $this->render('article/index.html.twig', [
                'controller_name' => 'UserController',
                'username' => $user->getLogin()
            ]);
        }
    }
    User.php
    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
    <?php
     
    namespace App\Entity;
     
    use Global\CoreBundle\Entity\User as CoreUser;
    use App\Repository\UserRepository;
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\Common\Collections\Collection;
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * @ORM\Entity(repositoryClass=UserRepository::class)
     */
    class User extends CoreUser
    {
        /**
         * @ORM\OneToMany(targetEntity=Article::class, mappedBy="user", orphanRemoval=true)
         */
        private $articles;
     
        public function __construct()
        {
            $this->articles = new ArrayCollection();
        }
     
        /**
         * @return Collection|Article[]
         */
        public function getArticles(): Collection
        {
            return $this->articles;
        }
     
        public function addArticle(Article $article): self
        {
            if (!$this->articles->contains($article)) {
                $this->articles[] = $article;
                $article->setUser($this);
            }
     
            return $this;
        }
     
        public function removeArticle(Article $article): self
        {
            if ($this->articles->removeElement($article)) {
                if ($article->getUser() === $this) {
                    $article->setUser(null);
                }
            }
     
            return $this;
        }
    }
    UserRepo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
     
    namespace App\Repository;
     
    use Global\CoreBundle\Repository\UserRepository as CoreUserRepository;
     
    class UserRepository extends CoreUserRepository
    {
     
    }
    merci d'avance !

  2. #2
    Membre confirmé Avatar de Elianora la blanche
    Femme Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 102
    Par défaut
    je pense que le repo utilisé est tjs le parent (celui du bundle) donc l'entité que je récupère est forcément de type parent également

    mais comment indiquer le repo à utiliser ?
    si je l'enlève de la conf, j'ai plein d'erreurs...

    à force de tenter des trucs, j'ai changé d'erreur ^^

    An exception occurred while executing 'SELECT t1.id AS id_2, t1.login AS login_3, t1.roles AS roles_4, t1.password AS password_5 FROM user t1 WHERE t0.id = ?' with params [1]:
    SQLSTATE[42S22]: Column not found: 1054 Unknown column 't0.id' in 'where clause'" at /var/www/html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php line 79
    évidemment, l'alias c'est t1 pas t0 ><

  3. #3
    Membre confirmé Avatar de Elianora la blanche
    Femme Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 102
    Par défaut
    j'avais trouvé https://www.doctrine-project.org/pro...e-mapping.html et décidé de faire un discriminant "single_table" mais la discriminator map est censée se trouver dans l'entité User parente
    or je veux que mon bundle soit le + générique possible...

    je ne sais plus quoi tester

  4. #4
    Membre éclairé
    Avatar de fenrir0680
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2007
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Manche (Basse Normandie)

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

    Informations forums :
    Inscription : Février 2007
    Messages : 49
    Billets dans le blog
    2
    Par défaut
    Salut,

    Si ton Global\CoreBundle\Entity\User utilise l'interface UserInterface de Symfony, dans ton UserController.php tu peux attendre le UserInterface plutôt que l'User :
    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
    <?php
     
    namespace App\Controller;
     
    ...
     
    class UserController extends AbstractController
    {
        #[Route('/articles/{user}', name: 'user_articles')]
        #[Entity('user', options: ['id' => 'user'])]
        public function articles(UserInterface $user): Response
        {
            dd($user->getArticles());
            return $this->render('article/index.html.twig', [
                'controller_name' => 'UserController',
                'username' => $user->getLogin()
            ]);
        }
    }


  5. #5
    Membre confirmé Avatar de Elianora la blanche
    Femme Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 102
    Par défaut
    j'ai testé mais ça ne fonctionne toujours pas...
    j'ai essayé plusieurs choses et j'avais différentes erreurs

    si je mets juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public function articles(UserInterface $user, TranslatorInterface $translator): Response
    {}
    dans UserController.php, j'obtiens l'erreur
    Cannot autowire argument $user of "App\Controller\UserController::articles()": it references interface "Symfony\Component\Security\Core\User\UserInterface" but no such service exists. Did you create a class that implements this interface?
    si je mets le paramConverter tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /**
         * @ParamConverter("user", class="ApplicationUser")
         */
    j'obtiens l'erreur
    Class "ApplicationUser" does not exist
    j'ai aussi essayé avec ou sans le discriminator
    avec, l'entité est toujours de type RegisteredUser
    sans, je retrouve l'erreur
    An exception occurred while executing 'SELECT t1.id AS id_2, t1.login AS login_3, t1.email AS email_4, t1.roles AS roles_5, t1.password AS password_6 FROM sfw_user t1 WHERE t0.login = ?' with params
    j'ai opté pour une autre méthode en attendant mais ça m'énerve ><


    voici le "core bundle" que j'ai renommé (mais ça ne change pas le principe) : https://github.com/DelPlop/sf-user-bundle
    et le projet dans lequel j'essaye de l'intégrer : https://github.com/DelPlop/wish-list/tree/bundles

  6. #6
    Membre confirmé Avatar de Elianora la blanche
    Femme Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 102
    Par défaut
    j'ai encore un peu avancé, je n'ai plus d'erreur technique
    mais je ne peux pas me connecter ^^

    en effet, le discriminator utilisé à l'inscription est celui du bundle parent (registered) et lors de la connexion, c'est visiblement celui de l'enfant car ça ne fonctionne pas (identifiants invalides alors que c'est sûr que c'est bon)
    et si je modifie le discriminator en bdd, ça fonctionne

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

Discussions similaires

  1. Problème jointure sur Set : mauvaise colonne utilisée ?
    Par gargantua dans le forum Hibernate
    Réponses: 0
    Dernier message: 20/01/2011, 09h18
  2. Bug de CString ? ou mauvaise utilisation !
    Par globule71 dans le forum MFC
    Réponses: 11
    Dernier message: 12/04/2007, 17h36
  3. Mauvaise utilisation d'une DLL ?
    Par _SamSoft_ dans le forum C
    Réponses: 6
    Dernier message: 21/02/2007, 00h14
  4. Réponses: 2
    Dernier message: 11/04/2006, 18h53
  5. [EJB]Utilisation d'EJB entité CMP 2.x avec Websphere 6
    Par majenior dans le forum Websphere
    Réponses: 3
    Dernier message: 09/09/2005, 16h32

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