[RESOLU] Liste d'objet

Eléphant du PHP | 253 Messages

26 févr. 2017, 20:12

Bonjour à tous,

Pourriez vous m'aider, j'aimerais ajouter un attribut contentInvocie à ma classe:

Code : Tout sélectionner

<?php namespace Model; class Invoice{ private $_number; private $_date; private $_buyer; private $_contentInvoice; private $_total; public function __construct(){ } public function getNumber(){ return $this->_number; } public function setNumber($number){ if(is_int($number)){ $this->_number = $number; } } public function getDate(){ return $this->_date; } public function setDate($newDate){ $this->_date = $newDate; } public function getBuyer(){ return $this->_buyer; } public function setBuyer(Buyer $buyer){ if($buyer instanceof 'Buyer'){ $this->_buyer = $buyer; } } public function getTotal(){ return $this->_total; } public function setTotal($total){ $this->_total = $total; } public function getContentInvoice(){ return $this->_contentInvoice; } public function setContentInvoice(ContentInvoice $contentInvoice){ if($contentInvoice instanceof 'ContentInvoice'){ $this->_contentInvoice = $contentInvoice; } } }
Ici contentInvoice représente une ligne d'une facture (désignation, prix ...) par contre une facture en à plusieurs, je dois utiliser une liste ou un tableau pour cette attribut? Comment je fais pour manipuler les données?

Merci de votre aide.

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

27 févr. 2017, 14:41

salut,

pas de liste php juste des tableaux.
Prévoit la possibilité de fournir un tableau pour éviter les boucles (pourquoi pas avec un paramètre facultatif permettant d'indiquer s'il faut écraser le tableau existant, cas par défaut, ou ajouter au tableau).

ensuite à l'utilisation c'est à partir des fonctions de tableau.
si tu met la clef primaire correspondant à chaque ligne en index du tableau tu pourras retrouver une ligne par sont index de façon simple (sinon foreach + if).

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 253 Messages

27 févr. 2017, 15:14

Merci moogli,

J'ai fais comme ça

Code : Tout sélectionner

<?php namespace Model; class Invoice{ private $_number = 0; private $_date = date("d-m-Y); private $_buyer = ""; private $_contentInvoice = array(); private $_total = 0; public function __construct(){ } public function getNumber(){ return $this->_number; } public function setNumber($number){ if(is_int($number)){ $this->_number = $number; } } public function getDate(){ return $this->_date; } public function setDate($newDate){ $this->_date = $newDate; } public function getBuyer(){ return $this->_buyer; } public function setBuyer(Buyer $buyer){ if($buyer instanceof 'Buyer'){ $this->_buyer = $buyer; } } public function getTotal(){ return $this->_total; } public function setTotal($total){ $this->_total = $total; } /** * Add new row to Invoice * * @access public * @public * @param object, key * @return void */ public function addContentInvoice($obj, $key = null) { if ($key == null) { $this->items[] = $obj; } else { if (isset($this->items[$key])) { throw new KeyHasUseException("Key $key already in use."); } else { $this->items[$key] = $obj; } } } /** * delete row in Invoice * * @access public * @public * @param key * @return void */ public function deleteContentInvoice($key) { if (isset($this->items[$key])) { unset($this->items[$key]); } else { throw new KeyInvalidException("Invalid key $key."); } } /** * get row of invoice with key * * @access public * @public * @param key * @return void */ public function getContentInvoice($key) { if (isset($this->items[$key])) { return $this->items[$key]; } else { throw new KeyInvalidException("Invalid key $key."); } } }
Sa vous semble bon? en même temps je me posais quelques questions, je fais un mvc le contrôle des paramètres se fait dans mon modèle ou dans le contrôleur, une dernière question j'utilise des filter_input vous les conseillaient?

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

27 févr. 2017, 15:54

attention a tes exceptions elle ne sont peut être (surement pas) dans le même espace de nom et du coup il manque l'espace de nom devant (en gros un namespace pour les exceptions ce ne serait pas mal quitte a ce qu'il soit sous le namespace model => Model\Exception

pour ce qui est de la validation oui autant utiliser filter_var, attention quand même a comprendre ce que font les filtres. Par exemple le filtre email colle à la RFC tu ne voudras surement pas d'un utilisateur avec un email [email protected] (qui est valide) :)


je ne préconise pas les valeurs par défaut, car généralement inutile ou trompeuse (est ce que le zéro c'est parce que le mec à rien mis ou c'est la valeurs qu'il veux ?
est ce qu'il a mis la date du jour ou oublier de l'indiquer ?
c'est pour cela que le null est pratique ;)

si tu as une règle métier qui impose que l’absence de saisie de date implique que tu utilises la date du jour fait cela dans une classe business (appelée par le contrôleur).

je ne suis pas certain que les exceptions soit utile, a toi de voir si cela correspond à ta manière de faire (tu pourrais très bien te dire que le mec indique une clef mais qui peux se gourer et quand même ajouter plutôt que lever une exception ;)

sinon un MVC, ne contient pas que 3 couches sinon c'est le bordel

M : Modèle image des données métier (souvent une image de la base de données qui les contient).
V : la vue ne fait qu'afficher ce que lui demande le controleur
C : prends les entrants et sais qui doit réaliser les actions pour traiter les données et qu'elle vue afficher en retour.

ajoute à cela une couche métiers (business quoi ;) ) qui va contenir les règles métiers, la validation des données les appels au modèle (la couche DAO, c'est un motif de conception ;) ) et finalement retourner des données (si besoin) ou lever une exception.

Le MVC c'est la mécanique qui fait tourner l'application mais pour pas le polluer il faut une autre couche qui va s'occuper des règles métiers.

du coup, perso les contrôles de données c'est dans la couche métier le contrôleur en a rien a foutre si les données sont bonnes ou pas, il transmet l'info ;)

cela n’empêche pas le modèle d'avoir des règles de gestions. Par exemple en java il existe des annotions permettant les contrôles de surface (taille min, max, )

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 253 Messages

27 févr. 2017, 16:49

Merci beaucoup pour cette très bonne explication,

J'ai modifié comme vous me l'avez conseillez.
Du coup dans Model j'ai rajouter deux sous dossiers DAO et exception dans DAO, par contre je n'ai pas très bien compris pour les exceptions je fais une classe dédier pour ça, comment je l'utilise? DAO à l'intérieur je m'est la vérification des données et mes requêtes sql?

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

28 févr. 2017, 11:44

alors c'est plutôt
\
\ model
\ Invoice
\ dao
\InvoceDAO
\ controller
\ business
\ InvoiceBusiness
\ vue
\ exception
\ BouletteException

La dao utilise le model et les exceptions, le modèle est utilisé par tout le monde ou presque (il est quand même possible de mettre une classe du modèle dans une exception donc du coup par tout le monde :)).

avec ça tu as une vue clair de ton projet, pas besoin de fouiller pour trouver quelque chose, un model dans model, une vue dans vue ...

coté espace de nom
model => \model
dao =>\dao
etc.

tu peux aussi appliquer le "prefixe vendeur" pour éviter que tu ne crée une classe qui risque de se retrouver en collision avec une autre (parce que bon il est possible qu'il y ai d'autre InvoiceDAO, c'est le soucis avec les conventions rependu ;) )

du coup
namespace kevin254kl\dao (par exemple)

et pour finir oui une classe par exception perso et une classe par fichier (regarde psr-1 et psr-2 pour cela).

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 253 Messages

02 mars 2017, 16:56

Super merci.