Page 1 sur 1

Explication pour une bonne architecture

Posté : 31 oct. 2019, 18:58
par sniopibna
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']); }

Re: Explication pour une bonne architecture

Posté : 11 nov. 2019, 16:18
par kevin254kl
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.

Re: Explication pour une bonne architecture

Posté : 14 nov. 2019, 22:18
par sniopibna
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

Re: Explication pour une bonne architecture

Posté : 21 nov. 2019, 19:04
par kevin254kl
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?

Re: Explication pour une bonne architecture

Posté : 28 déc. 2019, 19:12
par sniopibna
Bonjour déolé du retard, pour la simple et bonne raison que j'aimerais comprendre la logique d'un modèle mvc et poo sur un projet sans framework, car je risque de ne pas comprendre le framework si je n'arrive même pas à utiliser la poo convenablement...est ce que mon raisonnement est logique ou bien il est préférable de passer par un framework et de comprendre ces notions..

Re: Explication pour une bonne architecture

Posté : 08 janv. 2020, 14:02
par Saian
Bonjour, je pense que tu as plutôt bien compris la logique du MVC qui consiste a séparer les couches modèles, vues et contrôleurs.

Pour ce qui est de savoir si tu persistes le panier en base de données ou non, c'est plus une question de savoir si tu veux que l'utilisateur puisse retrouver son panier lorsqu'il revient sur le site et si tu veux pouvoir procéder par exemple à des relances de paniers ou des statistiques.

Et non tu ne dois pas créer de page annexe add.php. Dans la logique tout passe par ton contrôleur principal. le fichier index.php. L'ajout d'une méthode addToCart sur le contrôleur panier est la bonne méthode. Il faudrait en revanche que tu dynamise ton contrôleur principal afin de ne pas avoir à ajouter du code dedans pour chaque méthode des sous contrôleurs. Il faudrait qu'il soit capable d'instancier tout seul le bon contrôleur et d'appeler la bonne méthode.

Tu peux faire cela de différentes manières, la méthode basique serait d'avoir 2 paramètres dans toutes tes adresses, controller et method par exemple. ces paramètres peuvent être plus ou moins masqués derrière une réécriture d'url. Attention car il ne faudrait pas non plus avoir à ajouter de nouvelles règles de réécriture pour chaque adresse.

Tu peux aussi tenter de mettre en place un système de routes un peu plus complexe où la route correspond à un pattern d'uri, ce qui te permettrai de trouver la bonne route à partir de l'uri puis avec une sorte de map des routes te permettant de savoir qu'elle contrôleur/méthode appeler en fonction de la route. Un système dans ce sens te donnerait plus de liberté dans la création des adresses.