Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
j'aimerai savoir quelle est la bonne façon de procéder pour implémenter une partie d'administration.
Par exemple pour mon site voici ma conception :
- module Application
- module News : système de news
- module Comments : système de commentaires
Que dois-je faire pour créer une partie administration ?
Exemple :
Dans mon module Application, j'ai les modèles "Aliment.php" et "AlimentTable.php", et j'ai le contrôleur "AlimentController.php" avec une action "indexAction()" qui affiche tous les aliments présents en base dans la table "aliments".
- Est ce que je dois dans mon module Admin ajouter un contrôleur "AlimentController" avec les actions "addAliment", "updateAliment", "deleteAliment", ainsi que les modèles "Aliment.php" et "AlimentTable.php" ?
OU
- Est-ce que je défini les méthodes "addAliment", "updateAliment", "deleteAliment", directement dans mon contrôleur "AlimentController.php" de mon module Application, ainsi que les vues, en donnant un accés à ces URL uniquement pour un utilisateur à pour rôle admin ?
OU
- Une autre façon de faire ?
Merci
Hors ligne
Bonjour,
je te conseillerai de t'inspirer de ceci :
https://github.com/Grafikart/BlogMVC/tr … Framework2
Un blog MVC qui gère un petit système de commentaire et de news sur un blog, sans partie admin je crois (Orkin confirmera)
Le but étant de voir comment côté conception c'est foutu.
Je précise, ensuite, par rapport a ta question : "addAliment", "updateAliment", "deleteAliment" etc... sont plutot des élement CRUD qu'il faudrait implémenter dans ta couche service et non pas ton contrôleur, ton contrôleur AlimentController pourrait avoir addAction, updateAction, deleteAction qui appelerai un service AlimentService. Ce serait plus propre selon moi.
Et après si tu juge nécéssaire de mettre aliment dans ton module Application ou de créer un autre module c'est toi qui voit.
Plus tu compartimente, et isole tes composants, plus ton appli est souple. Après ou places tu la barre ?
Hors ligne
"addAliment", "updateAliment", "deleteAliment", je parlais bien évidemment des actions "addAlimentAction()", "updateAlimentAction()", "deleteAlimentAction()".
Un blog MVC qui gère un petit système de commentaire et de news sur un blog, sans partie admin je crois (Orkin confirmera)
Le but étant de voir comment côté conception c'est foutu.
Mes modules de Comments et News fonctionnent correctement.
Ma question repose sur la partie Administration d'un site. Voir mon exemple
Hors ligne
Hello
Pour ce qui est de tes fonctions add, update, remove je rejoins JGreco.
dans un controlleur on parle d'action (addAction) qui appel des services (addAliment).
Y a plusieurs façon de structurer en module ton site, juste à titre informatif je vais te donner l'exemple qui me convient le plus :
un module news qui va te permettre de gérer toutes tes fonctionnalités de news (add, update, displayUnité, displayListe, etc...)
et ensuite deux module : site front / site admin qui va te permettre de récupérer tes services de news dans tes pages.
Exemple : ModuleFront => pageAccueil = $newsService->displayListe();
AdminModule => pageNews => $newsService->displayListe() + bouton qui renvois vers $newsService->addNews()
etc..
Dernière modification par flobrflo (21-11-2014 14:51:24)
Hors ligne
d'accord merci je comprends ton exemple. Mais qu'entends tu lorsque tu parles de "service" ? c'est un composant propre à ZF2 ?
Hors ligne
Salut, pour ton module Admin tu peux le séparer et tu n'as pas forcément besoin de dupliquer les modèles tu peux utiliser ceux déjà existant. Les modules communiquent entre eux.
Là dans ton cas tu aurais le module Admin qui a des dépendances à tes modules "applicatifs" genre Aliments, Comments etc ... De cette façon si tu n'as pas activé ces modules tu ne pourras pas utiliser ton module Admin (ça évite les crash en plein milieu de l'utilisation).
Ensuite la couche service c'est ce qui se trouve entre la couche des contrôleurs et la couche des modèles. C'est dans celle-ci que tu fais tes requêtes et ta logique métier. Les contrôleurs sont là pour seulement traiter tes formulaires et renvoyer du contenu à la vu c'est tout. Tes services eux vont s'occuper de créer un objet Aliment que tu vas ensuite enregistrer en base de données. L'avantage d'avoir une couche service c'est que tu peux avoir besoin de créer des aliments un peu partout dans ton application et ça te permet de le réutiliser facilement .
Hors ligne
Merci pour tes explications.
Dans mon module Application > models, j'ai un modèle Food.php :
[lang=php] <?php namespace Application\Model; class Food { public $food_id; public $food_name; public $food_content; public $food_price; public $food_img; public $food_cat_id; public $food_type_name; public function exchangeArray($data) { $this->food_id = (isset($data['food_id'])) ? $data['food_id'] : null; $this->food_name = (isset($data['food_name'])) ? $data['food_name'] : null; $this->food_content = (isset($data['food_content'])) ? $data['food_content'] : null; $this->food_price = (isset($data['food_price'])) ? $data['food_price'] : null; $this->food_img = (isset($data['food_img'])) ? $data['food_img'] : null; $this->food_cat_id = (isset($data['food_cat_id'])) ? $data['food_cat_id'] : null; $this->food_type_name = (isset($data['food_type_name'])) ? $data['food_type_name'] : null; } }
et un modèle FoodTable.php :
[lang=php] <?php namespace Application\Model; use Zend\Db\TableGateway\TableGateway; class FoodTable { protected $tableGateway; public function __construct(TableGateway $tableGateway) { $this->tableGateway = $tableGateway; } public function fetchAll() { $resultSet = $this->tableGateway->select(); return $resultSet; } // Sélectionne tous les aliments de la catégorie passé en paramètre public function fetchAllByCat($cat) { $select = new \Zend\Db\Sql\Select; $resultSet = $this->tableGateway->select(function($select) use($cat){ $select->columns(array('food_id','food_name','food_content','food_price','food_img','food_type_name')) ->where(array('food_cat_id' => $cat)); }); return $resultSet; } public function getFood($id) { $id = (int) $id; $rowset = $this->tableGateway->select(function($select) use($id) { $select->columns(array('food_id','food_name','food_price','food_type_name')) ->where(array('food_id' => $id)); }); $row = $rowset->current(); if (!$row) { throw new \Exception("Could not find row $id"); } return $row; } public function saveFood(Food $food) { $data = array( 'food_id' => $food->food_id, 'food_name' => $food->food_name, 'food_content' => $food->food_content, 'food_price' => $food->food_price, 'food_img' => $food->food_img, 'food_cat_id' => $food->food_cat_id, 'food_type_name' => $food->food_type_name ); $id = (int)$food->food_id; if ($id == 0) { $this->tableGateway->insert($data); } else { if ($this->getFood($id)) { $this->tableGateway->update($data, array('food_id' => $id)); } else { throw new \Exception('Form id does not exist'); } } } public function deleteFood($id) { $this->tableGateway->delete(array('food_id' => $id)); } }
Ce sont eux mes services donc ?
Comme tu peux le voir j'ai mes méthodes CRUD dans le fichier FoodTable. Dans mon module Application, je n'utilise que les méthodes "fetchAllByCat", "getFood", et "saveFood".
Il y a également la présence de la méthode "deleteFood" qui elle est réservé pour la partie Admin.
Donc, je dois dans mon module admin, afficher une page qui permet à l'administrateur de supprimer un aliment en appelant cette méthode "deleteFood" ?
Hors ligne
Yop,
non, sa c'est la couche model, comme l'indique le namespace ^^.
La couche service sert a regroupe un ensemble de routine qui pourrai être exploiter régulièrement.
Ta couche controller elle ne doit s'occuper uniquement que d’analyser les requête et de renvoyé les bonne Vues configurer correctement.
idéalement ton controlleur doit avoir le moins possible connaissance de ta couche model: il utilise des services.
Par exemple pour une suppression, on peut vérifié que l'entrée existe avant. on peut aussi vouloir archivé ou logé l'entrée quelque part... c'est ta couche service qui fera sa, en faisant appelle a divers fonction de ta couche model.
exemple algorithmique:
requête domainename/deleteFood?id=451
- controller:
deleteFoodAction
-> parametre id existe?
-> oui : this->getFoodService()->deleteFood(id);
-> delete reussi?
-> oui : on redirge vers la vue avec un message ok
-> non : on redirige vers la vue avec un message derreur
-> non : on redirige en indiquant que la requete est éronné (pourquoi pas une page erreur 404?)
- Dans la fonction deleteFood du service foodService
-> on vérifie que l entée existe grace a model/FoodTable/FindById (je sais pas grand utilité mais c'est pour l'exemple)
-> on fait tout autre traitement obligatoire toujours grace a des fonction ce trouvant dans model/FoodTable (ou tout autre model, par exemple l'archivage, l'incrémentation d'un compteur, ect)
-> Si et seulement si tout c'est bien passé, on suprimme l'entrée avec FoodTable/deleteFood(id)
on retourne le résultat de tout sa, par exemple true, si tout est ok.
J'espère que mon algo est claire
Dernière modification par Splyf (22-11-2014 14:57:27)
Hors ligne