Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème sur instanciation d'une classe

Sujet résolu
    8 février 2024 à 12:14:38

    Bonjour.

    Je me suis fait un petit contrôleur :

    <?php
    
    namespace App\Controllers;
    
    use Twig\Environment;
    use App\Config\Config;
    use App\Models\PostModel;
    
    class PostController extends BaseController
    {
        private $postModel;
        protected $twig;
    
        public function __construct(Environment $twig)
        {
            $postModel = new PostModel;
            $this->postModel = $postModel;
            $this->twig = $twig;
        }
    
        public function create_post_Form()
        {
            echo $this->twig->render('post/add_post_form.twig');
        }
    // la suite ... 
    

    Mais j'ai un message d'erreur au niveau de la ligne

    $postModel = new PostModel;

    Même problème sur sur cette ligne dans un autre contrôleur
    Je vous donne mon postModel si jamais :

    <?
    namespace App\models;
    
    class PostModel extends BaseModel
    {
        protected $table = 'posts';
    
        public function __construct()
        {
            parent::__construct();
        }
    
        public function getAllPosts()
        {
            return $this->getAll();
        }
    
        public function getPostByID($id)
        {
            return $this->getById($id);
        }
    
        public function create($postData)
        {
            // Insérer un nouvel article dans la base de données
            $sql = "INSERT INTO {$this->table} (title, content, author_id, creation_date) VALUES (?, ?, ?, NOW())";
            $params = [$postData['title'], $postData['content'], $postData['author_id']];
            $this->execute($sql, $params);
            return $this->db->lastInsertId();
        }
    
        public function update($id, $postData)
        {
            // Mettre à jour un article dans la base de données
            $sql = "UPDATE {$this->table} SET title = ?, content = ? WHERE id = ?";
            $params = [$postData['title'], $postData['content'], $id];
            $this->execute($sql, $params);
        }
    
        public function delete($id)
        {
            // Supprimer un article de la base de données
            $sql = "DELETE FROM {$this->table} WHERE id = ?";
            $this->execute($sql, [$id]);
        }
    }
    
    

    Si quelqu'un a une idée, je suis preneur.

    Merci d'avance



    • Partager sur Facebook
    • Partager sur Twitter
      8 février 2024 à 13:41:15

      Bonjour, quelle erreur pour commencer ? PS, cela ne devrait pas plutôt être
      $thid->$postModel = new PostModel;


      -
      Edité par Comar91 8 février 2024 à 13:44:28

      • Partager sur Facebook
      • Partager sur Twitter
      Comar
        8 février 2024 à 14:43:33

        • Il ne faut pas utiliser la balise courte <?
        • Il manque un use pour BaseModel ?
        • use App\Models\PostModel; vs namespace App\models; : fais attention, sous Unixoïde, si la casse n'est pas respectée ça risque de te jouer des tours

        Sinon, même remarque que mon VDD, dire qu'on a une erreur sans la donner, ça n'aide guère, il peut s'agir de tout et n'importe quoi.

        -
        Edité par julp 8 février 2024 à 14:44:22

        • Partager sur Facebook
        • Partager sur Twitter
          8 février 2024 à 15:13:16

          Hello,

          Autre les messages des personnes au dessus, J'ajouterai si on veut mieux faire les choses :

          • C'est une préférence perso mais j'aime bien avoir les parenthèses vide au call du constructeur
          • Le nom de ta méthode en snake_case alors qu'il faut (en PHP en tout cas) écrire avec du camelCase
          • Il manque le typage des propriétés des classes
          • Le bind des valeurs dans une requête, je préfère avec des noms, c'est je trouve plus clair.
          • Les 3 commentaires (Insérer, Mettre à jour, Supprimer) un article [...] ne sont pas utile car le nom des méthodes sont plutôt claire

          Au passage : J'ai l'impression d'avoir déjà vu ce code écrit comme ça quelque part. Est-ce que tu ne suis pas un tuto sur Youtube ?

          • Partager sur Facebook
          • Partager sur Twitter
            8 février 2024 à 16:44:44

            j'ai un autel constructeur avec un autre model (construit de la même façon) qui ne pose aucun problème :

            Le controller

            <?php
            
            namespace App\Controllers;
            
            use App\Config\Config;
            use Twig\Environment;
            use App\Models\UserModel;
            
            class UserController extends BaseController
            {
                private $userModel;
                protected $twig;
            
                public function __construct(Environment $twig)
                {
                    $userModel = new UserModel;
                    $this->userModel = $userModel;
                    $this->twig = $twig;
                }
            
                public function add_user_Form()
                {
                    $config = new Config;
                    $base_url = $config->getBaseUrl();
                    echo $this->twig->render('admin_user/add_user_Form.twig', ['base_url' => $base_url]);
                }
            
                public function add_user()
                {
                    $config = new Config;
                    $base_url = $config->getBaseUrl();
                    // Récupérer les données du formulaire
                    $userData = [
                        'username' => $_POST['username'],
                        'email' => $_POST['email'],
                        'password' => $_POST['password'],
                        'role' => $_POST['role'],
                        // Ajoutez d'autres champs ici
                    ];
            
                    // Ajouter un utilisateur
                    $this->userModel->create($userData);
            
                    echo $this->twig->render('admin_user/user_added.twig', ['base_url' => $base_url]);
            
                }
            
                public function update_user_Form($id)
                {
                    $config = new Config;
                    $base_url = $config->getBaseUrl();
                    // Récupérer les données de l'utilisateur à modifier
                    $user = $this->userModel->getUserById($id);
            
                    $data = array(
                        'user' => $user,
                        'base_url' => $base_url
                    );
                    // Afficher le formulaire de modification avec les données de l'utilisateur
                    echo $this->twig->render('admin_user/update_user_Form.twig', $data);
                }
            
                public function update($id)
                {
                    $config = new Config;
                    $base_url = $config->getBaseUrl();
                    // Récupérer les données du formulaire
                    $userData = [
                        'username' => $_POST['username'],
                        'email' => $_POST['email'],
                        'password' => $_POST['password'],
                        'role' => $_POST['role'],
                    ];
            
                    // Mettre à jour l'utilisateur
                    $this->userModel->update($id, $userData, $base_url);
            
                    // Rediriger vers la liste des utilisateurs
                    header("Location:" . $base_url . "admin");
                    exit;
                }
            
                public function delete_user_confirmation($id)
                {
                    $config = new Config;
                    $base_url = $config->getBaseUrl();
                    // Récupérer les données de l'utilisateur à supprimer
                    $user = $this->userModel->getUserById($id);
                    $data = array(
                        'user' => $user, 
                        'base_url' => $base_url
                    );
            
                    // Afficher la confirmation de suppression avec les données de l'utilisateur
                    echo $this->twig->render('admin_user/delete_user_confirmation.twig', $data);
                }
            
                public function delete($id)
                {
                    $config = new Config;
                    $base_url = $config->getBaseUrl();
                    // Supprimer l'utilisateur
                    $this->userModel->delete($id);
            
                    // Rediriger vers la liste des utilisateurs
                    header("Location:" . $base_url . "admin");
                    exit;
                }
            }
            

            et le Moedel

            <?php
            
            namespace App\Models;
            
            class UserModel extends BaseModel
            {
                protected $table = 'users';
            
                public function __construct()
                {
                    parent::__construct();
                }
            
                public function getAllUsers()
                {
                    return $this->getAll();
                }
            
                public function getUserById($id)
                {
                    return $this->getById($id);
                }
            
                public function create($userData)
                {
                    // Insérer un nouvel utilisateur dans la base de données
                    $sql = "INSERT INTO {$this->table} (username, email, password, role) VALUES (?, ?, ?, ?)";
                    $params = [$userData['username'], $userData['email'], hash('sha256', $userData['password']), $userData['role']];
                    $this->execute($sql, $params);
                    return $this->db->lastInsertId();
                }
            
                public function update($id, $userData)
                {
                    // Mettre à jour un utilisateur dans la base de données
                    $sql = "UPDATE {$this->table} SET username = ?, email = ?, password = ?, role = ? WHERE id = ?";
                    $params = [$userData['username'], $userData['email'], hash('sha256', $userData['password']), $userData['role'], $id];
                    $this->execute($sql, $params);
                }
            
                public function delete($id)
                {
                    // Supprimer un utilisateur de la base de données
                    $sql = "DELETE FROM {$this->table} WHERE id = ?";
                    $this->execute($sql, [$id]);
                }
            
                // Autres méthodes de gestion des utilisateurs
            }
            

            Je vous donne le code complet de PostController

            <?
            namespace App\models;
            
            class PostModel extends BaseModel
            {
                protected $table = 'posts';
            
                public function __construct()
                {
                    parent::__construct();
                }
            
                public function getAllPosts()
                {
                    return $this->getAll();
                }
            
                public function getPostByID($id)
                {
                    return $this->getById($id);
                }
            
                public function create($postData)
                {
                    // Insérer un nouvel article dans la base de données
                    $sql = "INSERT INTO {$this->table} (title, content, author_id, creation_date) VALUES (?, ?, ?, NOW())";
                    $params = [$postData['title'], $postData['content'], $postData['author_id']];
                    $this->execute($sql, $params);
                    return $this->db->lastInsertId();
                }
            
                public function update($id, $postData)
                {
                    // Mettre à jour un article dans la base de données
                    $sql = "UPDATE {$this->table} SET title = ?, content = ? WHERE id = ?";
                    $params = [$postData['title'], $postData['content'], $id];
                    $this->execute($sql, $params);
                }
            
                public function delete($id)
                {
                    // Supprimer un article de la base de données
                    $sql = "DELETE FROM {$this->table} WHERE id = ?";
                    $this->execute($sql, [$id]);
                }
            }
            
            

            Je vous donne une image du message d'erreur

            PS : je ne passe pas un tuto YouTube

            edit :
            Mince, je pensais que l'image s'afficherait en grand en cliquant dessus :(
            On peut toujours faire 'ctrl+molette' :)

            -
            Edité par FCL31 8 février 2024 à 16:51:32

            • Partager sur Facebook
            • Partager sur Twitter
              8 février 2024 à 16:56:36

              > Il ne faut pas utiliser la balise courte <?

              Ton code n'est pas interprété parce que ton serveur n'est pas configuré avec short_open_tag à on voilà pourquoi il est recommandé de toujours employer<?php à sa forme courte qui, elle, est toujours valable/ne dépend d'aucun paramètre.

              -
              Edité par julp 8 février 2024 à 16:57:32

              • Partager sur Facebook
              • Partager sur Twitter
                8 février 2024 à 17:08:06

                Ah ***,

                Malgré que tu l'avais précisé plus haut, j'avait pas vu. :(

                Merci beaucoup.

                A la prochaine pour un prochain épisode ^^

                • Partager sur Facebook
                • Partager sur Twitter

                Problème sur instanciation d'une classe

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                • Editeur
                • Markdown