les Conventions en cakePHP
J’ai beaucoup insister sur les conventions dans les posts précédents dans ce post on va détaillé un peu plus cet aspect fondamental de CakePHP.
Qui dit conventions dit accords.
Une convention n’est pas une règle.
Une règle c’est quelque chose d’obligatoire, une convention non. Mais ça peut engendrer des pénalités, dans notre contexte c’est une diminution de la productivité.
Cependant la convention peut créer des obligations. C’est-à-dire qu’on dit : voilà cette chose elle est comme ça. Pourquoi ? Ben pourquoi pas ? On bâtit dessus et on avance.
Et pourquoi ?
Un seul mot, productivité.
Ok, je comprends mieux, mais Cake dans tout ça ?
Vous l’avez compris, Cake favorise la convention à la configuration, au lieu de proposer des fichiers de configuration longs et encombrants il propose des conventions, si on les respecte on va voir notre productivité augmenter sinon ben y a toujours moyen de faire ce qu’on veut (l’aspect flexible) mais pas aussi rapidement que si on suit les conventions.
Quel genre de conventions cake propose-t-il alors ? Principalement des conventions de nommage, des fichiers aux champs de base de données, mais pas seulement.
De toute façon on va voir les plus importantes maintenant :
La base de données
Est-ce que vous nommez vos tables en majuscule ou en minuscule ? En pluriel ou en singulier ? Et les champs ? La clé primaire ? Les clés étrangères ? Vous ne suivez aucune logique ?
Cake propose une façon d’écrire tout ça :
- Les tables sont en minuscule et au pluriel. ordinateurs, imprimantes, lunettes, maisons, etc. Si on a un nom composé, faut séparé les mots par _ et faut que le dernier soit au pluriel toujours. Par exemple si on a une table des chaînes d’or on va l’écrire or_chaines. Si on a catégories des articles on va écrire article_categories, les grandes maisons au bord de la mer, bord_de_la_mer_grandes_maisons.
- Les champs des tables en minuscule
- La clé primaire se nomme id, elle est de type entier et auto_increment ou équivalent
- Deux champs created et modified peuvent être dans chaque table, cake va en prendre soin.
- Une clé étrangère vers une table poissons se nommera poisson_id, remarquez poisson et au singulier et un suffixe _id est ajouté. Une autre clé étrangère vers une table pays se nommera pays_id ce n’est pas donc juste une affaire de s à la fin, faut spécifier le singulier correctement. Cependant ça ne marche que pour l’anglais. Mais pas de panique on pourra ajouter nos propres mots et règles aussi.
- Si on a une jointure entre deux tables, par exemple, produits, categories en (N,N). Le nom de la table de jointure doit être les noms des deux tables séparés par _ et dans l’ordre alphabétique. Donc categories_produits et non produits_categories. Cette table de jointure doit contenir au minimum deux champs, category_id et produit_id, les conventions des clés étrangères sont appliquées ici. Remarquez que c’est category_id et non categorie_id, parce que c’est en anglais, mais bien sûr on pourra changer ça si on y tient.
Les Modèles
Les modèles sont souvent liés aux tables de la base de données.
- Les noms des classes sont au singulier et la première lettre est en majuscule. Donc un modèle d’une table de base de données categories se nommera Category. Pays pour une table pays et Cheval pour une table chevaux. Si vous essayer les deux derniers exemples ça ne va pas marcher, parce que ce n’est pas des mots anglais ; et de ce fait Cake ne sait pas faire le pluriel/singulier. Il faut donc lui apprendre tout simplement. Pour les modèles des tables aux noms composés genre article_categories, on procède comme suit : on supprime chaque _ et on met en majuscule la lettre qui suit. Le dernier mot et supposé être au pluriel on le met au singulier. Donc ArticleCategory. Pour bord_de_la_mer_grandes_maisons ça doit être BordDeLaMerGrandesMaison.
- Pour les noms des fichiers des modèles, ça doit être en minuscule et au singulier. On change rien d’autre. Donc pour la table produits le nom de fichier du modèle associé est produit.php. Pour une table article_categories, article_category.php, etc.
Ses conventions sont censées améliorer la création de code et le rendre plus lisible.
Maintenant, si pour une raison (j’espère juste) ou une autre, vous ne pouvez pas les respecter (pas possible de migrer la base de données car d’autres logiciels l’utilisent..), vous pouvez spécifier le nom du modèle avec var $name dans la définition de la classe. Aussi vous pouvez dire à cake d’associer une table à ce modèle en le spécifiant avec var useTable toujours dans la définition du modèle
// mon_model.php
Class MonModel extends AppModel {
var $name = ‘MonModel’ ;
var $useTable = ‘une_table’ ;
}
Contrôleurs
- Les noms des classes sont au pluriel et la première lettre est en majuscule. On ajoute Controller au nom de la classe aussi. Si on a un modèle qui se nomme Produit, son contrôleur associé se nommera ProduitsController, pour ArticleCategory, ArticleCategoriesController.
- Les noms des fichiers sont en minuscule et au pluriel, produits_controller.php pour ProduitsController et article_categories_controller.php pour ArticleCategoriesController.
- Par défaut toutes les fonctions membres des contrôleurs sont visibles, c’est-à-dire accessibles par un simple URI, localhost/produits/action. Si on veut avoir des actions invisibles, on doit les préfixer par _
// action invisible
function _actionx(){}
// action visible
Function actiony(){}
Les Vues
Le domaine vu est composé de trois choses, les layouts (gabarits) les éléments et les views (vues)
Les vues prennent le nom des actions associées. Mais puisque c’est des fichiers ils sont en minuscule, si l’action à un nom composé alors la vue les sépare par _.
Si on a une vu ProduitsController ::AjouterAuPanier() sa vue sera app/produits/ajouter_au_panier.thtml ( .ctp pour cake 1.2 )
Les composants
Les composants sont des classes réutilisables qui encapsulent un traitement logique et apportent un aide aux contrôleurs. Le nom de ces classes doit être suffixé par Component, le fichier par contre ne le doit pas.
// app/controllers/components/mon_composant.php
class MonComposantComponent extends Object {}
Les Helpers
Les Helpers sont des classes réutilisables qui encapsulent un traitement de présentation et apportent un aide dans le domaine Vue. Le nom de ses classes doit être suffixé par Helper, le fichier par contre ne le doit pas.
// app/views/helpers/mon_truc.php
class MonTrucHelper extends Helper {}
Vendors
vendor et tout code tiers exploitable immédiatement sans modification pour enrichir l’application. Pas de conventions donc pour les vendors. Exemple de vendors, PEAR, AMFphp, ou tout simplement une classe que vous avez écrite.
On est d’accord maintenant ?
Voilà, avec un peu de pratique tout ça deviendra évident, vous permettra ainsi de se focaliser sur d’autres choses plus importante. et d’aller plus vite.


Comments:
Dia [http://aurmil.free.fr/]
20 03 2007 - 07:33 #
Si on veut avoir des actions invisibles, on doit les préfixer par _
// action invisible
function _actionx(){}
// action visible
Function _actiony(){}
ça serait pas plutôt
Function actiony(){} ?
merci pour ce blog très intéressant :)
othman ouahbi [http://www.cakepourtous.org]
20 03 2007 - 10:17 #
Yep, typo, corrigé, merci.
Guillaume [http://www.intrapole.fr]
24 03 2007 - 11:10 #
on dit “post” pas “poste”, sinon ce post est intéressant ;)
othman ouahbi [http://www.cakepourtous.org]
24 03 2007 - 11:19 #
Yep, typo, Corrigé. merci².
Nicolas []
25 05 2007 - 02:46 #
On peut aussi ajouter un prefix admin_ à une méthode (action) d’un contrôleur si l’on souhaite y accéder avec une URI tel que localhost/admin/produits/action.
Ce prefix peut être défini par la constante CAKE_ADMIN dans le fichier app/config/core.php
Cela est assez utile si votre site web et sa partie admin sont regrouppés dans une seule appli web et que vous souhaitez démarquer les actions admin des autres.
:-)
oxygene []
4 06 2007 - 15:11 #
très bon site, félicitation à son auteur
Joff []
10 07 2007 - 13:45 #
Je comprends bien la nécessité d’avoir des conventions de nommages, mais ce que j’aimerais comprendre c’est la logique du traitement que Cake en fait? Est-ce qu’il y a des (routines de vérifications) qui lui permettent de bien orienté le code dans les bonnes composantes et en cas d’infraction, ce code n’est pas traité ou génère une erreur ??
othman ouahbi [http://www.cakepourtous.org]
10 07 2007 - 18:17 #
Bien évidemment :)
yagh []
17 07 2007 - 13:04 #
Hello,
P’tite question de débutant a propos des bases de données. Si dans une table, on a deux clés étrangères qui se referent à la même table( par exemple, un ticket qui a comme clé étrangère l’id du demandeur et l’id de la personne assignée qui sont toutes les deux des personnes), on s’en sort comment?
Merci et bravo pour ce site.
othman ouahbi [http://www.cakepourtous.org]
19 07 2007 - 15:38 #
Bonjour Yagh,
Il suffit de nommer tes associations:
var $belongsTo = array( ‘Demandeur’=> array(‘className’=>‘Personne’, ‘foreignKey’=>‘demandeur_id’), ‘PersonneAssigne’=> array(‘className’=>‘Personne’, ‘foreignKey’=>‘personne_assigne_id’) );
Fabian Pijcke [http://www.siteduzero.com]
4 09 2007 - 18:38 #
Bonjour,
Je pense qu’il serait intéressant de notifier que les champs “created” et “modified” (ou “updated”) doivent être de type DATETIME, ce n’est pas forcément trivial pour les débutants :)
Très bon site / article.
Sharky []
21 10 2007 - 09:01 #
A quand la suite ???
Ce blog est-il mort ?
Dommage car je le trouve très agréable et il me serait d’une grande utilité :)