A free and open-source book on ZF3 for beginners

Translation into this language is not yet finished. You can help this project by translating the chapters and contributing your changes.

4.23. Contrôleurs légers, gros modèles et vues simples

Lors du développement d'un site à l'aide de la structure Model-View-Controller, il existe un risque de mauvaise compréhension du rôle des contrôleurs, des vues et des modèles. Cela a pour conséquence de rendre les contrôleurs énormes et les modèles réduits, ce qui rend difficile le test et la prise en charge de votre application. L'objectif de cette section est de vous donner une idée générale du code qui peut être placé dans une classe de contrôleur, du code qui peut être placé dans une vue et du code qui peut être placé dans une classe modèle.

4.23.1. Des Controleurs Légers

L'idée derrière le terme "contrôleur léger" est que typiquement, dans vos classes de contrôleur, vous mettez seulement le code qui :

Une classe contrôleur devrait éviter :

Pour un exemple de contrôleur "léger", regardez la classe CurrencyConverterController ci-dessous. Ce contrôleur fournit l'action "convert" dont l'objectif est de convertir une somme d'argent de l'euro vers l'USD. L'utilisateur transmet le montant d'argent via la variable GET "amount".

class CurrencyConverterController extends AbstractActionController 
{  
    // Currency converter model
    private $currencyConverter;

    // Constructor. It's purpose is to "inject" dependencies.
    public function __construct($currencyConverter)
    {
        $this->currencyConverter = $currencyConverter;
    }

    // The "convert" action displays the converted money amount
    public function convertAction() 
    {  
        // Get the money amount from GET
        $amount = (float)$this->params()->fromQuery('amount', -1);
    
        // Validate input data
        if($amount<0) {
            // Money amount is missing
            $this->getResponse()->setStatusCode(404);
            return;
        }
 
        // Pass the data to the CurrencyConverter model
        $convertedAmount = $this->currencyConverter->convertEURtoUSD($amount);	
		
        return new ViewModel([
            'amount'=>$amount,
            'convertedAmount'=>$convertedAmount
        ]);
    }
}

La méthode action du contrôleur ci-dessus est la suivante: * Récupère les données transmises par l'utilisateur du site (ligne 16). Ces données font généralement partie de l'objet Request et peuvent être récupérées à l'aide de la méthode getRequest() du contrôleur ou du plugin de controleur Params.

4.23.2. Gros Modèles

Parce que vous devez garder vos contrôleurs aussi légers que possible, la majeure partie de la logique métier de votre application doit être placée dans des classes modèles. Dans une application Model-View-Controller correctement conçue, les modèles semblent "énormes". Une classe de modèle peut contenir le code qui :

Dans une classe modèle, il n'est pas recommandé de:

Si vous suivez ces principes, vous constaterez que vos modèles seront faciles à tester car ils auront des entrées et des sorties clairement identifiées. Vous pourrez écrire un test unitaire qui transmet certaines données à la fin de l'entrée du modèle, récupère les données de sortie et vérifie que les données sont correctes.

Si vous n'êtes pas sûr d'où mettre certaines parties de code (dans un contrôleur ou dans un modèle), demandez-vous : est-ce une logique métier importante qui doit être testée avec soin ? Si la réponse est oui, vous devriez mettre le code dans un modèle.

4.23.3. Vue simples

Étant donné que la majeure partie de la logique est stockée dans des modèles, vos vues doivent être aussi simples que possible pour produire la présentation des données transmises dans le conteneur de variables. Dans une vue, vous pouvez :

La vue n'est pas recommandé pour :

Si vous suivez ces principes, vous constaterez que vos vues peuvent facilement être remplacées sans modifier la logique métier de votre application. Par exemple, vous pouvez facilement modifier la conception de vos pages web, ou même introduire des thèmes modifiables.


Top