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 | 328 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