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

Langage PHP Discussion :

Formulaire d'inscription en POO, avec une structure MVC [POO]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chomeur
    Inscrit en
    Octobre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Octobre 2019
    Messages : 19
    Points : 33
    Points
    33
    Par défaut Formulaire d'inscription en POO, avec une structure MVC
    Bonjour tout le monde,

    Dans le cadre d'un projet étudiant je dois faire un système de CRUD sans framework en PHP POO, respectant une architecture MVC.
    J'ai fais la plus grosse partie du travail, puisque j'ai complété les model, les view, et les controllers. J'ai un affichage correct via une template Bootstrap.

    J'ai instauré une partie User pour permettre à chacun de s'inscrire, et une fois l'inscription faite de se connecter. Le problème que je rencontre commence quand je clique sur le bouton du formulaire d'inscription, j'obtiens l'erreur suivante :
    Fatal error: Uncaught Error: Call to a member function getErrorsPseudo() on null in C:\wamp64\www\XXXXX\controller\ControllerAuthentification.php on line 52
    L'erreur me renvoie donc vers une partie de mon controller gérant l'authentification, ici la ligne en question est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $errP = $user->getErrorsPseudo();
    Il semble donc que j'essaye d'appeler la méthode getErrorsPseudo() depuis une variable renvoyant null. Pourtant deux lignes plus haut je déclare la variable $user en tant que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     $manager = new UserManager();
     $user = $manager->verify($pseudo, $email);
    J'ai bien conscience qu'un problème en architecture MVC n'est pas forcément évident à visualiser, alors voici mon GitHub

    Merci beaucoup à ceux qui liront.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    salut,

    il ne faut pas tout mélanger :
    Ta classe MyAutoload en charge de l'autoloading est définie dans le fichier config.php ! Euh, la configuration n'a pas a définir l'autoloader encore moins l'implémentation du code en charge de cette fonctionnalité. Le mécanisme de découverte des classes fait partie du démarrage de l'environnement d'exécution et pas de sa configuration.

    Ensuite tu définis : define('CONTROLLER', ROOT.'OC-Project-4/'.'controller/'); et ton erreur pointe cette arborescence : C:\wamp64\www\XXXXX\controller\ControllerAuthentification.php, y'a pas comme un décalage ?

    Enfin, lis ce billet stp

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Chomeur
    Inscrit en
    Octobre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Octobre 2019
    Messages : 19
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    Du coup j'ai bien lu ton billet en entier, mais je ne comprends pas bien ce que tu reproches à mon code, tu veux dire que toute la partie define() ou j'indique où trouver quoi devrait se trouver dans un fichier à part ?
    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
    class MyAutoload
    {
        public static function start()
        {
            session_start();
     
            spl_autoload_register(array(__CLASS__, 'autoload'));
     
            $root = $_SERVER['DOCUMENT_ROOT'];
            //Ne pas oublier de supprimer le OC-Project-4 lors de la mise en ligne du site.
            $host = $_SERVER['HTTP_HOST'].'/OC-Project-4';
     
            define('HOST', 'http://'.$host.'/');
            define('ROOT', $root.'/');
     
            define('CONTROLLER', ROOT.'OC-Project-4/'.'controller/');
            define('MODEL', ROOT.'OC-Project-4/'.'model/');
            define('VIEW', ROOT.'OC-Project-4/'.'view/');
            define('CLASSE', ROOT.'OC-Project-4/'.'class/');
     
            define('PUBLICS', HOST.'public/');
     
            define('DB_HOST', 'localhost');
            define('DB_NAME', 'oc4');
            define('DB_USERNAME', 'root');
            define('DB_PASSWORD', 'PASSWORD');
        }
     
        public static function autoload($class)
        {
            if(file_exists(MODEL.$class.'.php')) {
                include_once(MODEL.$class.'.php');
            } elseif(file_exists(CLASSE.$class.'.php')) {
                include_once(CLASSE.$class.'.php');
            } elseif(file_exists(CONTROLLER.$class.'.php')) {
               include_once(CONTROLLER.$class.'.php');
            } elseif(file_exists(VIEW.$class.'.php')) {
                include_once(VIEW.$class.'.php');
            }
     
        }
    }
    Je déplacerai donc toute cette partie dans un fichier MyAutoload à part ? Mais dans ce cas, qu'est ce que je fais de avec config.php ? J'indique la route jusqu'à l'Autoload ?

    Et sinon concernant mon problème de base, si j'ai mis des 'XXXX' c'était pour éviter d'embrouiller + qu'autre chose. Je pense que je vais supprimer Error et ErrorManager et mettre les regex et une suite d'if/else au niveau de la view, ce sera bien plus simple en plus d'avoir un meilleur rendu esthéthique.

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    salut,

    continue à lire mon blog, en particulier sur le MVC

    Regarde ton code dans MyAutoload : tu définies des constantes pour le serveur web define('HOST', 'http://'.$host.'/');, des constantes de la base de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    define('DB_HOST', 'localhost');
    define('DB_NAME', 'oc4');
    define('DB_USERNAME', 'root');
    define('DB_PASSWORD', 'PASSWORD');
    Bref, ton autoloader est un peu fourre-tout. Tu dois bien séparer les concepts manipulés : l'autoloader ne doit s'occuper que du mécanisme d'autoloading des classes.
    Ce qui à attrait au serveur ou à la base de données ne le concerne pas (en POO on va parler de Responsabilité)
    Enfin, ton code de transformation de nom pleinement qualifié en chemin de fichier est améliorable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static function autoload($class)
    {
        $paths = [MODEL, CLASSE, CONTROLLER, VIEW];
        foreach ($paths as $p) {
            if (file_exists($p.$class.'.php') {
                include $p.$class.'.php';
                return true;
            }
        }
        return false;
    }
    D'ailleurs je ne comprends pas ton raisonnement : tu ne sais pas trop où est rangé le fichier, donc tu vas au pif regarder dans plusieurs répertoires jusqu'à le trouver !
    Normalement, l'utilisation d'un mécanisme d'autoloading est assujetti à un nommage propre et net des classes (nommage pleinement qualifié, j'entends)
    T'es sûr de ton coup ?

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Chomeur
    Inscrit en
    Octobre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Octobre 2019
    Messages : 19
    Points : 33
    Points
    33
    Par défaut
    Bonsoir,

    déja merci pour tes conseils.

    Si je suis ton raisonnement, ça signifierai que dans un fichier à part, je mettrai les constantes pour définir la connexion à la BDD, par exemple on peut imaginer dbAcess.php qui contiendrait ces 4 lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    define('DB_HOST', 'localhost');
    define('DB_NAME', 'oc4');
    define('DB_USERNAME', 'root');
    define('DB_PASSWORD', 'PASSWORD');
    Mais dans ce cas là, je devrais instancier dbAcess.php au début de config.php, et de MyAutoload (si effectivement je met MyAutoload dans un fichier à part) via un require_once() par exemple ?

    Quand tu dis que vu que je ne sais pas où est rangé le fichier, je vais regarder au pif un peu partout, je pense que tu fais référence à ces lignes là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     if(file_exists(MODEL.$class.'.php')) {
                include_once(MODEL.$class.'.php');
            } elseif(file_exists(CLASSE.$class.'.php')) {
                include_once(CLASSE.$class.'.php');
            } elseif(file_exists(CONTROLLER.$class.'.php')) {
               include_once(CONTROLLER.$class.'.php');
            } elseif(file_exists(VIEW.$class.'.php')) {
                include_once(VIEW.$class.'.php');
            }
    Effectivement, mais dans le cadre de mes études je suis suivi par un mentor, et c'est lui qui m'a conseillé de faire ça, et c'est vrai que je n'ai pas forcément trouvé de meilleure technique pour aller trouver les fichiers.

    Qu'entends-tu par
    l'utilisation d'un mécanisme d'autoloading est assujetti à un nommage propre et net des classes (nommage pleinement qualifié, j'entends)
    ? Je ne suis pas sûr d'avoir compris

    Merci beaucoup.

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    On peut aussi regrouper toutes les constantes dans un fichier constants.php qui est inclus à chaque appel dans ton index.php.

    Quand je te parle d'un nommage propre et net, je fais référence à la clause use que tu retrouve en début de chaque fichier utilisant des dépendances. C'est le use qui va aider le mécanisme d'autoloading à transformer le nom pleinement qualifié d'une classe en chemin de fichier physique.
    Or je ne vois pas du tout de use dans tes fichiers. Tant que t'y es, regarde aussi son corollaire namespace.

    Je dois aussi te demander si tu rediriges toutes les requêtes vers un unique point d'entrée : index.php par exemple.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Chomeur
    Inscrit en
    Octobre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Octobre 2019
    Messages : 19
    Points : 33
    Points
    33
    Par défaut
    Bonsoir,

    Encore merci pour tes conseils, je ferai un découpage propre des fichiers demain et ferai un feedback.

    Concernant mon index, il est assez sobre et ne contient que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
     
    include_once ('config.php');
     
    MyAutoload::start();
     
    (isset($_GET['r'])) ? $request = $_GET['r'] : $request = 'index';
     
    $router = new Router($request);
    $router->renderController();
    Sinon au début de mon projet j'avais essayé d'utiliser les namespaces pour une meilleur organisation. Mais c'était flou car j'obtenais tout le temps des erreurs de fichiers non trouvé, d'un côté on me disait d'utiliser des /, de l'autre des \, enfin c'était brouillon. Après, maintenant que j'ai un autoloader configuré, ça vaut peut être le coup de retenter les namespaces, pour une meilleure lisibilité et un meilleur fonctionnement, qu'est ce que tu en penses ?

    Mais je ne vois pas trop comment mettre ça en place de l'autoloader, est ce que je supprime les define() ? Est ce que je vais devoir imbriquer les namespaces à un endroit précis de l'autoloader ?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/07/2007, 08h45
  2. Problème avec une structure
    Par titux dans le forum C
    Réponses: 5
    Dernier message: 22/07/2007, 16h26
  3. Problème avec une structure
    Par Pierre.g dans le forum C
    Réponses: 4
    Dernier message: 30/12/2006, 12h22
  4. Probléme avec une structure
    Par astragoth dans le forum C++
    Réponses: 3
    Dernier message: 25/04/2006, 20h31
  5. Réponses: 11
    Dernier message: 28/12/2004, 16h15

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