Jan
31

Modifier les Contrôleurs dans Yii

Voici la traduction en français du dernier des 8 articles de la série de Larry Ullman Learning the Yii Framework. Vous pouvez trouver la version originale de l’article sur le site de l’auteur : Basic Controller Edits in Yii.

Après avoir utilisé les outils en ligne de commande de Yii ainsi que l’outil Gii pour construire les bases d’une application, et après avoir modifié les Modèles et les fonctionnalités de CRUD, il reste encore un peu de modifications à apporter (même si Yii effectue réellement une large partie du travail). Les articles précédents ont abordé la modification des Modèles et des Vues. Nous allons ici traiter des Contrôleurs. J’ai remarqué que j’apporte beaucoup moins de modifications à mes Contrôleurs auto-générés qu’à mes Modèles ou mes Vues. Ceci est assez logique, puisque le Modèle contient l’essentiel du code et que la Vue est l’interface que voit l’utilisateur, tandis que le Contrôleur est avant tout un intermédiaire entre les deux (voir à ce propos ma série sur le MVC [en] pour en apprendre davantage).

Le Contrôleur représente les actions qu’un utilisateur effectue sur un site : afficher un enregistrement donné, mettre à jour un enregistrement, lister tous les enregistrements, … Les requêtes de l’utilisateur (c’est-à-dire le fait de charger une URL) sont prises en charge par l’application Yii, puis transmises au Contrôleur approprié. Le rôle du Contrôleur est d’effectuer les opérations nécessaires, comme le chargement ou la manipulation de certains Modèles, puis de transmettre les données à la Vue. Comme dans n’importe quelle définition de classe, toutes les tâches sont effectuées dans des méthodes.

Le premier élément que vous allez rencontrer dans une classe de type Contrôleur est une variable nommée $layout :

public $layout='//layouts/column2';

Comme expliqué dans l’article sur les Vues, cette variable indique lequel des deux layouts disponibles – une colonne ou deux colonnes – le Contrôleur doit utiliser. Vous pouvez changer cette valeur afin de modifier le layout pour l’ensemble du Contrôleur, ou vous pouvez modifier $this->layout au sein de chaque méthodes.

Vous trouverez également une autre variable de classe, qui n’est pas présente par défaut, mais que vous devrez ajouter :

public $defaultAction='admin';

Comme je l’ai précisé un peu plus haut, les Contrôleurs définissent les actions qui peuvent être effectuées : lister des enregistrements, afficher un enregistrement spécifique, gérer les soumissions de formulaire, … Pour chaque action, il existe une méthode correspondante dans la classe Contrôleur : actionIndex(), actionView(), actionCreate(), … La ligne de code ci-dessus définit la méthode qui doit être appelée si aucune méthode n’est invoquée. Par conséquent, avec cette ligne, l’URL www.example.com/index.php/employee appelle la méthode actionAdmin() tandis que www.example.com/index.php/employee/create invoque actionCreate(). La valeur par défaut, si vous n’ajoutez pas cette ligne, est d’appeler actionIndex().

Vos Contrôleurs disposent aussi de méthodes qui ne sont pas des actions, comme accessRules(). Cette méthode est essentielle du point de vue de la sécurité, puisqu’elle définit qui peut faire quoi. En ce qui concerne le « quoi », il s’agit des actions : list, show, create, update et delete. Le « qui » dépend de la situation, mais pour commencer, il y a au moins les utilisateurs logués et les utilisateurs non logués, représentés par * (tout le monde) et @ (utilisateurs logués). En fonction du système d’identification en place, vous pouvez avoir différents niveaux d’utilisateurs, comme les administrateurs. La méthode accessRules() utilise donc ces informations et retourne un tableau de valeurs. Ces valeurs sont elles-mêmes des tableaux indiquant les permissions (allow ou deny), les actions et les utilisateurs :

public function accessRules()
{
return array(
array('allow', // allow all users to perform 'index' and 'view' actions
'actions'=>array('index','view'),
'users'=>array('*'),
),
array('allow', // allow authenticated user to perform 'create' and 'update' actions
'actions'=>array('create','update'),
'users'=>array('@'),
),
array('allow', // allow admin user to perform 'admin' and 'delete' actions
'actions'=>array('admin','delete'),
'users'=>array('admin'),
),
array('deny', // deny all users
'users'=>array('*'),
),
);
}

Ceci est le paramétrage par défaut, où tout le monde peut accéder aux actions index et view, ce qui signifie que tous les utilisateurs peuvent lister tous les enregistrements ou consulter un enregistrement particulier du Modèle associé. La section suivante permet à n’importe que utilisateur logué pour effectuer les actions create et update. Ensuite, seuls les administrateurs peuvent accéder aux actions admin et delete. Enfin, on ajoute un refus global pour l’ensemble des utilisateurs, pour gérer toute situation qui ne serait pas explicitement définie. Il s’agit simplement d’une bonne pratique de sécurité. Sachez que ces règles ne s’appliquent qu’aà ce Contrôleur, et que vous devrez définir ces règles pour chaque Contrôleur.

Vous pourrez modifier ces règles pour chaque Contrôleur et chaque situation. Par exemple, j’ai construit un site avec un système d’inscription, représenté par un Modèle Contact. Dans ce cas, n’importe qui doit pouvoir créer un nouveau Contact, mais seul l’administrateur est autorisé à lister ou afficher les Contacts. En général, je pense que la plupart des Contrôleurs autorisent tout le monde à effectuer les actions show et list.

Vous pouvez également utiliser des expressions conditionnelles plus élaborées pour créer vos permissions, mais cela sera traité dans un autre article [NDT : lien vers le site de Larry Ullman]. Par exemple, sur l’un des projets que j’ai réalisés, un utilisateur logué pouvait créer cretains types de contenu, mais ils ne pouvaient modifier ou supprimer que les contenus dont ils étaient l’auteur. Vous pourriez aussi faire en sorte que les utilisateurs ne voient que leurs propres Contacts.

Enfin, vous pouvez modifier les Contrôleurs pour que la récupération des enregistrements du Modèle soit gérée différemment. Il existe différentes méthodes qui chargent les enregistrements qui seront affichés dans les Vues. Certaines de ces méthodes, comme actionView() ou actionUpdate(), font appel à la méthode loadModel(), dont le rôle est de ramener un seul enregistrement. D’autres méthodes, comme actionIndex() et actionAdmin(), ramènent tous les enregistrements du Modèle, en utilisant une approche différente. Dans ces méthodes, vous pourrez avoir besoin d’effectuer quelques modifications. Pour commencer, si le Modèle en question est lié à un autre Modèle, selon ce qui a été définit dans la méthode relations() de la classe Modèle (cf. l’article sur les Modèles), vous pouvez faire appel à cette relation lorsque vous récupérez les enregistrements. Par exemple, ce code récupère un employé ainsi que le service auquel auquel il appartient :

$models=Employee::model()->with('department')->findByPk((int)$id);

Évidemment, ne faites ceci que si vous utilisez les enregistrements liés.

Vous pouvez également modifier le criteria qui est appliqué à ces méthodes, mais ceci est un sujet assez vaste. En gros, il s’agit d’appliquer une clause SQL WHERE à une requête. Je traiterai ce point dans un prochain article, mais vous pouvez bien sûr vous reporter à la documentation de Yii.

Nous voici au terme de ce huitième et dernier épisode de cette série, qui vous a permis de créer une application du début à la fin (où presque). Un certain nombre de sujets en relation avec cet article n’ont pas été traités et peuvent faire l’objet d’autres articles.

Une dernière fois, je vous rappelle que vous pouvez retrouver l’article original sur le site de Larry Ullman : Basic Controller Edits in Yii.



10 Comments to “Modifier les Contrôleurs dans Yii”

  • Heady 28 novembre 2011 à 22 h 16 min

    Cette série d’article est vraiment idéale pour débuter avec Yii.

    Merci pour cette traduction.

  • François 15 mai 2012 à 17 h 24 min

    A la recherche d’un framework PHP, je suis tombé sur cette présentation de Yii et je dois dire que ça donne une assez bonne idée des fonctionnalités.
    Merci pour ce travail de traduction.

  • Spleen 10 juillet 2012 à 16 h 13 min

    merci beaucoup pour cette traduction!

  • FredT 25 septembre 2012 à 10 h 58 min

    Et bien encore un grand merci supplémentaire pour la traduction, en espérant que cette série sur YII ne soit pas la dernière.
    Elle m’a permis également de me faire une idée quant à mon choix d’un framework plus adapté en remplacement de ZF1 que je trouvais de plus en plus lourd: plus l’impression de gagner du temps en l’utilisant, manque de performance quand pas le temps de se pencher assez sous le capot…

  • Romain 29 septembre 2012 à 20 h 34 min

    Que dire, si ce n’est Merci pour cette traduction ! :)

  • François 4 décembre 2012 à 22 h 50 min

    Encore moi.

    Serait-il possible de télécharger le tuto (en pdf par exemple) ?
    Sauf erreur, je ne vois pas de lien de téléchargement et j’avoue que ce serait vraiment pratique de pouvoir le consulter off line.
    Merci par avance et pour tout.

  • Vince 29 mars 2013 à 15 h 59 min

    Salut, merci pour le tuto. Plus d’article de prévu ? J’en aurais besoin :)

    Encore Merci !

  • john 17 juin 2014 à 23 h 22 min

    Hello,
    Super merci pour ce tuto et cette traduction ! Après avoir développer mon site avec Symfony 1.4, je ne voulais pas passer à la V2. Trop de changement régulier, manque de souplesse et usine à gaz, même si j’aime bien certains aspect. Mais bon l’engin est lourd, surtout si on peut pas installer APC ou qu’on à pas un serveur dédié avec quadriprocesseur minimum :)
    Alors j’espère que cette superbe introduction, et pour une fois livré avec une notice FR du framework vont me permettre de trouver chaussure à mon pied ! Et qu’il va durer longtemps comme sa communauté !
    Merci et vivement les prochaines articles !

  • Mounir QUATRA 4 septembre 2014 à 13 h 00 min

    Merci pour cette traduction

  • Hicham DJELLOULI 2 mars 2016 à 11 h 08 min

    Trop bénéfique et pratique, merci beaucoup

Poster un commentaire

Edito

Bienvenue sur Mémorandom.

Mémorandom est le blog de 2 développeurs web, Appo et Nico.

Vous y trouverez des informations sur différents domaines touchant de près ou de loin au développement web

Tutoriels Yii Framework

Nos derniers articles

Blogs Dev

Liens

Étiquettes