Explication pour une bonne architecture

Petit nouveau ! | 6 Messages

31 oct. 2019, 18:58

Bonjour à tous,

Je souhaite créer un site e-commerce en php poo, du coup je souhaite être orienté afin de ne pas faire d'erreur.

J'ai créer un index

Code : Tout sélectionner

<?php require "controller/IndexController.php"; require "controller/ItemsController.php"; if (isset($_GET['page'])) { if (!empty($_GET['page'])) { if ($_GET['page'] == 'items') { $controller = new \Controller\ItemsController(); $controller->listItems(); } elseif ($_GET['page'] == 'accueil') { $controller = new \Controller\IndexController(); $controller->index(); } elseif ($_GET['page'] == "item" && !empty($_GET['id'])) { $controller = new \Controller\ItemsController(); $controller->itemById(); } elseif ($_GET['page'] == "panier") { $controller = new \Controller\PanierController(); $controller->index(); } else { // Si aucune page n'est connu , on lance une erreur 404 $controller = new \Controller\IndexController(); $controller->error(); } } } else { // Par défaut, on lance la page index $controller = new \Controller\IndexController(); $controller->index(); }
J'ai bien compris que le controller faisait office de lien entre la vue et les models.

Par contre je bloque lorsque je souhaite ajouter un article dans mon panier, je ne sais pas comment je dois procéder.

voici ma class Panier , ou ma methode construct demarre une session et créer un tableau en session $_SESSION['panier'].

Par contre est ce que je dois créer une page annexe du style "add.php" qui viendra traiter l'ajout d'un article (d'ailleur si je le fais , je ne sais pas ou l'ajouter avec le modele MVC, quelle est la bonne pratique) dans ma session ou bien je dois le faire directement dans la classe Panier avec une methode spécifique.

Mais lorsque j'essaie de mettre en place une fonction specifique du style addItem(), ça ne fonctionne pas..

Je vous laisse le code :

Merci pour vos conseils :

Code : Tout sélectionner

<?php namespace Model; use \Exception; class Panier extends \Model\Model { protected $_db; public function __construct() { session_start(); $_SESSION['panier'] = []; $this->_db = new Database(); } public function add($item_id) { $product = $this->_db->prepare("SELECT * FROM items WHERE id = ?",[$item_id], "\Model\Items"); } }

Code : Tout sélectionner

<?php namespace Controller; require_once("model/autoload.php"); class PanierController extends \Controller\Controller { protected $panier; public function __construct() { $panier = new \Model\Panier(); $this->panier = $panier; } public function index() { require_once "views/panierView.php"; } public function addToCart($item_id) { $this->panier->add($item_id); require "views/panierView.php"; } }
voici la partie concernée dans le routeur:

Code : Tout sélectionner

elseif($_GET['page'] == "addItem"){ $controller = new \Controller\PanierController(); \Model\Database::debug($controller); $product = $controller->addToCart($_GET['id']); }

Eléphant du PHP | 333 Messages

11 nov. 2019, 16:18

Salut,

Utilise l'injection de dépendance

Code : Tout sélectionner

public function __construct() { session_start(); $_SESSION['panier'] = []; $this->_db = new Database(); }

Code : Tout sélectionner

public function __construct(Database $db) { session_start(); $_SESSION['panier'] = []; $this->_db = $db; }
Tu devrais aussi mettre tes requête sql à l'extérieur de ta classe qui ne doit avoir qu'un seul role. Pas de fichier add.php en oop toute est objet.

Petit nouveau ! | 6 Messages

14 nov. 2019, 22:18

Ok cool merci pour l'info !
je ne comprend pas lorsque tu dis de ne pas mettre mes requêtes dans ma classe? n'est-cepas l'objectif? les models ne regroupent pas les requete sql ?

Merci pour l'éclaircissement

Eléphant du PHP | 333 Messages

21 nov. 2019, 19:04

Les bonnes pratiques en poo sont une classe un rôle, ta classe modèle contient la définition tes attributs et méthode. Tu devrais avoir une classe qui gère le sql (insert, select) et qui prend en paramètre ton objet. Tu as déjà des orm qui font ça https://www.doctrine-project.org/projec ... index.html
Pourquoi tu n'utilises pas un framework?