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 :

Impossible de déclarer Constantes publiques dans classe (fixtures)


Sujet :

Symfony PHP

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut Impossible de déclarer Constantes publiques dans classe (fixtures)
    Bonjour à tous,

    En voulant mettre en relation 2 fixtures, je voulais créer une constante 'public const MAX_TYPES = count($types);' dans ma fixture, mais ni le terme public ni const ne sont acceptés dans le code.

    J'ai pourtant regardé dans des tutos, l'expression semble correcte quant à la déclaration de constantes publiques.

    Cette constante permettrait de connaître la longueur du tableau '$types' de façon à randomiser dans la fixture dépendante avec un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->getReference('type_vehicule_'.rand(1,TypesVehicules::MAX_TYPES)
    Car je n'ai pas trouvé d'autre méthode pour obtenir une valeur aléatoire de la part d'une fixture parente...

    Je suis preneur si une autre solution existe...

    Merci d'avance

    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
    <?php
     
    namespace App\DataFixtures;
     
    use App\Entity\TypesVehicules;
    use Doctrine\Bundle\FixturesBundle\Fixture;
    use Doctrine\Persistence\ObjectManager;
    use Symfony\Component\String\Slugger\SluggerInterface;
     
    class TypesVehiculesFixtures extends Fixture
    {
     
        public function __construct(private SluggerInterface $slugger){      
     
        }        
     
        public function load(ObjectManager $manager): void
        {
     
            $types = ['citadine', 'véhicule industriel', 'familial', 'berline', 'limousine', 'motocyclette', '3 roues', 'quad'];
          public const MAX_TYPES = count($types);
     
            for ($i = 0; $i < count($types); $i++) {
     
                $type = new TypesVehicules();
                $type->setNomtype($types[$i]);
                $type->setSlug($this->slugger->slug($types[$i]));
     
                $manager->persist($type);
                $this->addReference('type_vehicule_' . $i, $type);
            }
            $manager->flush();
        }
    }

  2. #2
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 321
    Points : 642
    Points
    642
    Par défaut
    Une constante ou une propriété de classe se déclare dans la classe et pas dans une méthode.
    https://www.php.net/manual/fr/langua....constants.php

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Bonjour Pytet et merci pour votre réponse...

    Autrement dit dans le cas qui nous intéresse on ne peut pas le mettre en place...

  4. #4
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 321
    Points : 642
    Points
    642
    Par défaut
    Bonjour clickandgo,

    Si tu veux déclarer une constante de classe, tu dois la déclarer dans la classe et non dans une méthode.
    Les constantes de classes sont par défaut publiques donc on peut omettre le mot clé public dans la déclaration.

    Tu ne peux pas initialiser la constante de classe avec l'expression count($types), déjà parce que la variable $types n'est pas définie lors de l'initialisation de la constante (portée des variables) mais aussi car il n'est pas possible d'utiliser une fonction pour initialiser une constante de classe (voir la syntaxe des constantes) :
    Lors de l'utilisation du mot-clé const, seules les expressions de type scalaires (bool, int, float et string) et des arrays constants contenant seulement des expressions scalaires sont acceptées.

    Pas sûr que ce soit la meilleure approche ni ce que tu souhaites faire, mais si ton tableau $types est constant, tu pourrais éventuellement le déclarer en constante de classe et utiliser count() sur cette constante pour récupérer le nombre de type :
    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
    <?php
     
    namespace App\DataFixtures;
     
    use App\Entity\TypesVehicules;
    use Doctrine\Bundle\FixturesBundle\Fixture;
    use Doctrine\Persistence\ObjectManager;
    use Symfony\Component\String\Slugger\SluggerInterface;
     
    class TypesVehiculesFixtures extends Fixture
    {
        const TYPES = [
            'citadine',
            'véhicule industriel',
            'familial',
            'berline',
            'limousine',
            'motocyclette',
            '3 roues',
            'quad',
        ];
     
        public function __construct(private SluggerInterface $slugger)
        {
        }
     
        public function load(ObjectManager $manager): void
        {
            $typesCount = count(self::TYPES);
     
            for ($i = 0; $i < $typesCount; $i++) {
                $type = new TypesVehicules();
                $type->setNomtype(self::TYPES[$i]);
                $type->setSlug($this->slugger->slug(self::TYPES[$i]));
     
                $manager->persist($type);
                $this->addReference('type_vehicule_' . $i, $type);
            }
     
            $manager->flush();
        }
    }

    Si tu veux définir le nombre maximum de type de ta fixture en constante de classe (const MAX_TYPE = 10; par exemple), le fait que $types soit un tableau fini (8 éléments pour l'instant : "citadine", "berline", etc.) n'est pas forcément le plus adapté : il faudrait que $types contienne au moins MAX_TYPE élément pour le bon fonctionnement de ta fixture (et/ou utiliser la fonction php min() pour récupérer le bon nombre de types).
    Tu peux tester cet exemple avec MAX_TYPES = 5 (les 5 premiers types devraient être chargés) et MAX_TYPES = 10 (seulement 8 types devraient être chargés) :
    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
    <?php
     
    namespace App\DataFixtures;
     
    use App\Entity\TypesVehicules;
    use Doctrine\Bundle\FixturesBundle\Fixture;
    use Doctrine\Persistence\ObjectManager;
    use Symfony\Component\String\Slugger\SluggerInterface;
     
    class TypesVehiculesFixtures extends Fixture
    {
        const MAX_TYPES = 5;
     
        public function __construct(private SluggerInterface $slugger)
        {
        }
     
        public function load(ObjectManager $manager): void
        {
            $types = [
                'citadine',
                'véhicule industriel',
                'familial',
                'berline',
                'limousine',
                'motocyclette',
                '3 roues',
                'quad',
            ];
     
            $typesCount = min(count($types), self::MAX_TYPES);
     
            for ($i = 0; $i < $typesCount; $i++) {
                $type = new TypesVehicules();
                $type->setNomtype($types[$i]);
                $type->setSlug($this->slugger->slug($types[$i]));
     
                $manager->persist($type);
                $this->addReference('type_vehicule_' . $i, $type);
            }
     
            $manager->flush();
        }
    }
    Si tu veux charger un nombre d'entités correspondant à MAX_TYPE, le tableau $types pourrait alors être généré en fonction de la valeur de cette constante de classe.

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Merci beaucoup Pytet pour votre réponse que je vais relire à tête reposée

Discussions similaires

  1. déclarer une callback dans une classe
    Par mathieu3392 dans le forum Débuter
    Réponses: 17
    Dernier message: 01/06/2015, 10h46
  2. Impossible de déclarer un readonly dans main()
    Par insane_80 dans le forum C#
    Réponses: 7
    Dernier message: 28/10/2007, 22h37
  3. Réponses: 8
    Dernier message: 03/01/2007, 09h22
  4. [débutant]Définir constante dans classe
    Par Clark dans le forum C++
    Réponses: 11
    Dernier message: 11/05/2006, 17h43
  5. Réponses: 6
    Dernier message: 23/09/2005, 12h54

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