Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 21-11-2014 13:40:53

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Bonne conception entre le FrontEnd et le BackEnd

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

 

#2 21-11-2014 14:21:29

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: Bonne conception entre le FrontEnd et le BackEnd

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 ?


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#3 21-11-2014 14:47:21

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: Bonne conception entre le FrontEnd et le BackEnd

"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

 

#4 21-11-2014 14:49:32

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: Bonne conception entre le FrontEnd et le BackEnd

Hello smile

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.. smile

Dernière modification par flobrflo (21-11-2014 14:51:24)

Hors ligne

 

#5 21-11-2014 17:17:08

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: Bonne conception entre le FrontEnd et le BackEnd

d'accord merci je comprends ton exemple. Mais qu'entends tu lorsque tu parles de "service" ? c'est un composant propre à ZF2 ?

Hors ligne

 

#6 21-11-2014 17:48:03

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Bonne conception entre le FrontEnd et le BackEnd

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 smile.

Hors ligne

 

#7 21-11-2014 18:03:04

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: Bonne conception entre le FrontEnd et le BackEnd

Merci pour tes explications.

Dans mon module Application > models, j'ai un modèle Food.php :

Code:

[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 :

Code:

[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

 

#8 22-11-2014 14:53:08

Splyf
Membre
Date d'inscription: 24-10-2013
Messages: 115

Re: Bonne conception entre le FrontEnd et le BackEnd

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 smile

Dernière modification par Splyf (22-11-2014 14:57:27)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages