je te suggere d'ajouter un attribut de type array dans la classe Model avec la liste des champs dela table que tu veux inserer comme sa a chaque fois que tu extends la classe Modele tu pourras lui donner les champs que tu veux.
Bonjour à tous,
je suis entrain mtn de creer mon prorpe MVC
J'ai commencé à créer ma classe UserModel qui herite de la classe Model
dans la classe Model je veux créer une fonction qui permet d'inserer les donnes dans la BDD InsertData() et cette fonction doit être appelé ds la class UserModel
le problem je veux preciser les donnes et les champs a inserer depuis la classe UserModel et passer ces donnes a la fonction InsertData ()
comment je peux le faire???
Model.php:
UserModel.php:
UserController:
12 réponses
Salut, tu peux faire ceci
Attention ta fonction getPDO à un petit souci,
Balbert,Merci bcp pour la reponse
mais prk la foonction getPDO à des soucis ??
En faite, lorsqu'on appelle ta fonction getPDO deux fois de suite normalement cela plante !!
$this->getPdo();
$this->getPdo();
Pourquoi et comment ?
Ta fonction suit cette logique
Premiere appelle :
- $this->database vaut null donc on entre dans la condition if ($this->database === null) en ce moment la variable $pdo est definie.
- $this->database = $pdo, donc $this->database est une instance de PDO.
Deuxieme appelle : -
$this->database ne vaut plus null donc on entre pas dans la condition if ($this->database === null), ce qui implique que ta variable $pdo ne sera pas definie, comme $pdo n'est pas defini et que tu fais $this->pdo = $pdo, alors tout plante. :)
Voila voila
Salut,
effectivement pour getPDO il faut changer un peu :
Dans le constructeur de la class "UserController" il y a une incohérence :
normalement
fais en sorte que
soit une instance de la classe "UserModel"
Pourtant juste après, tu écrase cette instance que tu viens de créer par un "new" :
De plus, tu utilise 2 fois usero ici, ce n'est pas bon :
Il faut changer ça :
Détails : je ne sais pas si tu as les mêmes erreurs dans ton code chez toi, que les erreurs qui sont dans le code de ce message :
- à la définition de la class UserController, il manque un espace entre "UserController" et "extends"
- dans la fonction "add" de la class "UserController" tu appel "isnertUser" au lieu de "insertUser"
Oh dis donc, j'ai relu ta question et je me rend compte que je répond complètement à côté... Excuse moi, je réessaie.
Je vois un soucis d'organisation, tu as voulu créer une méhode générique "InsertData()" dans ta classe "Model", comme ça toutes les classes qui héritent de la classe "Model" auront cette fonction "InsertData()" de disponible.
C'est pas mal, mais au final cette méthode n'est pas générique puisque ce bout de code est trop spécifique :
Pour rendre ce bout de code générique j'imagine qu'on pourrait utiliser un foreach, avec $key, $value... Ça me parait galère...
Je pense qu'il vaut mieux créer une méthode bien spécifique à l'ajout d'un utilisateur, donc pas dans la classe générique "Model", mais dans la classe "UserModel".
(Supprime ta fonction insertData() de la classe "Model", et modifie la fonction "insertUser" de la classe "UserModel")
et dans UsersController :
Dans ta classe "Model" qui est générique, tu laissera la fonction getPdo(), et tu pourra ajouter des méthodes très générique comme par exemple :
SLK
j'ai fait la meme chose
pourquoi il faut changer cette fonction ?? en fait j'ai fait ce qu'il a fait jonathan :D
et j'ai pas bien compris cette partie :
pourriez-vous m'expliquer car je suis debutant dans le monde POO :P
Oui bien sur.
1)
Balbert te l'a déjà expliqué, mais je vais essayer d'y aller plus doucement.
cette ligne de code
est un "racourcis" pour faire 2 choses à la fois :
Maintenant qu'on sait ça, lançons le code pour la toute 1ère fois :
rappelons la fonction une 2ème fois :
2)
dans cette ligne :
"$this" représente le controller "UserController"
Ce controller à un attribut privé :
Ce controller à aussi une méthode "loadModel()" (dont il a hérite de la classe "Controller")
La méthode "loadModel()" se charge d'instancier une classe, et de "ranger" cette instance dans la variable privé "$ModelUser".
J'ai dit "une classe" ? Oui mais quelle classe ?
Celle que tu lui donne en paramètre. Ici on lui demande d'instancier la classe "UserModel" :
On a donc une instance de la classe "UserModel" dans notre variable privé $ModelUser. Parfait !
Mais juste après, on l'écrase en y mettant une nouvelle instance :
En vérité ces 2 lignes :
font la même chose, donc il faut en garder une, et supprimer l'autre.
C'est la 1ère qu'il FAUT garder. Parcequ'elle respecte le principe d'encapsulation, alors que la seconde, non.
Si tu ne connais pas le principe d'encapsulation, il faut savoir que c'est probablement LE grand principe que doit respecter du code orienté objet.
En gros, ce principe te dit qu'il ne faut jamais attribuer des valeurs à tes attributs directement (c'est à dire en utilisant un "=") :
Si tu veut initialiser ou modifier des attributs, tu DOIT passer par une méthode :
Je te laisse te documenter sur :
- le principe d'encapsulation en orienté objet
- les getters et setters
Au passage, pour "nommer" un attribut d'une classe, la convention nous dit de commencer par une minuscule, et d'utiliser des underscores entre chaque mots, exemples :
OK
- private $attribut;
- private $mon_attribut;
PAS OK
- private $Attribut;
- private $monAttribut;
- private $mon_Attribut;
Si ce genre de chose t'intéresses tu peux regarder du côté des conventions officielle "PSR"
il semble que la PSR-0 soit dépréciée, il faut regarder les PSR-1, PSR-2, PSR-3, PSR-4
http://www.php-fig.org/psr/psr-1/
Merci bcp SLK pour cette reponse qui'est tres clair ,
mais le problem quand je supprime une ligne par exemple :
cette ligne :
je recois ce message
Fatal error: Class 'UserModel' not found in C:\xampp\htdocs....
et quand je supprime l'autre
je recois ce message
Fatal error: Call to a member function getUser() on null....
je peux pas appeler les fonnctions de UserModel
mais quand je laisse les deux lignes tout marche bien
mais merci bcp quand meme pr ta reponse ;)
Ah, ok on va essayer de trouver d'où vient le problème.
Je maintiens qu'il faut conserver
et supprimer
Maintenant, essayons de trouver ce qui ne va pas.
J'ai 3 questions (en gras).
On a cette erreur :
Donne moi le chemin complet de l'erreur.
Et aussi, comment est-ce que tu "charge" tes classes ?
- avec des "require" en début de fichiers ?
- avec un "autoloader" et des "namespace" ?
Il dit qu'il ne trouve pas la classe "UserModel"
est-ce qu'au même titre que tu as une classe "UserController" qui hérite de la classe "Controller",
tu as bien une classe "UserModel" qui hérite de la classe "Model" ?
oui le meme titre et aussi j'ai la classe UserModel qui hérite de la classe "Model"
je charge les models (children Model) depuis la classe Controller avec cette fonction :
et je charge la classe Model depuis l'index voila mon index j'uitilse aucun autoloader :
Ah c'est bon je vois.
Ta fonction loadModel() ne fais que le require du fichier qui contient la classe, maintenant il faut aussi instancier cette classe :
Fatal error: Call to a member function getUser() on null....
Cette erreur venait du fait que tu devais faire quelque part
alors qu'on avait jamais instancié l'attribut $ModelUser, il vallait "null" et on essayait de lui appliquer une fonction (du coup, Fatal Error).
Il me semble que le reste est correct.