Kohana: introduction à la librairie ORM
Cet article est traduit de l'article suivant avec l'accord de son auteur
Un ORM est un Object Relationnal Mapper, et plus exactement un outil permettant de manipuler les données d'une base au travers d'objets. Ils évitent d'utiliser du SQL, et facilitent donc la sélection, l'enregistrement ou la destruction des données. Cet article présente au travers de quelque exemples les bases de l'implémentation d'ORM avec Kohana.
Pour les besoins de cet article, nous prenons l'exemple d'un site avec des articles. Nous avons donc besoin d'un modèle pour récupérer, insérer, mettre à jour et supprimer ces articles ainsi qu'un contrôleur pour que les utilisateurs puissent interagir avec eux.
En tant qu'introduction, cet article ne couvre pas l'implémentation des vues ni la sécurisation de l'application
Création de la table
Créer la table avec le code suivant:
1 2 3 4 5 6 7 8 | CREATE TABLE IF NOT EXISTS `articles` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) character SET latin1 NOT NULL, `text` text character SET latin1 NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; |
C'est aussi simple que ça. la champs auto-incrémente 'id' est obligatoire pour que l'ORM fonctionne ainsi que la pluralité du nom de la table articles.
Création du modèle pour interagir avec la table
Le nom du fichier pour le modèle est au singulier c'est-à-dire article.php. Il faut le placer dans le répertoire application/models.
Le fichier doit ressembler à ceci:
Notez que les relations entre tables ne son pas gérés dans cet article mais si vous les voulez alors ça doit être fait comme dans l'exemple commenté.
Voila c'est tout cedont vous avez besoin pour faire marcher l'ORM dans Kohana. Sympa non?
Création du contrôleur
Créer un contrôleur dans le répertoire application/controllers qu'on appellera de façon très originale 'article.php' et placez y le squelette suivant:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Article_Controller extends Controller { public function index() { } public function insert() { } public function view() { } } |
Lorsque l'on appelle http://localhost/article cela appelle la méthode index du contrôleur article et http://localhost/article/insert appelle la méthode insert.
On souhaite avoir les fonctionnalités suivantes:
- la méthode index() liste les 10 derniers article
- la méthode insert affiche un formulaire pour insérer des articles
- la méthode view permet d'afficher un article particulier dont l'identifiant 'id' est passé en paramètre. Elle est appelée par http://localhost/article/view/2
La méthode index
1 2 3 4 5 6 7 8 9 10 11 12 | public function index() { $articles=new Article_Model(); $articles=$articles->orderby('id','desc')->limit(10)->find_all(); echo '<ol>'; foreach($articles as $article) { echo '<li>'.$article->title.'</li>'; } echo '</ol>'; } |
Comme vous pouvez le constater, on charge ici notre modèle ORM Article_Model. Il lui demande de récupérer les 10 articles triés par 'id' descendants donc les 10 dernier. Notez l'utilisation du constructeur de requête chainée ( ->orderby('id','desc')->limit(10) ) ce qui rend l'ORM de Kohana assez puissante.
C'est la méthode find_all qui effectue réellement la requête et retourne le résultat. Il faut toujours terminer par find ou find_all dans la mesure ou ce sont ces instructions qui vont déclencher la requête.
Les articles ainsi trouvés sont ensuite parcourus et formatés en une liste ordonnée de résultats. Cette étape est normalement faite dans une vue mais ce n'est pas le but de cet article de vous montrer les vues.
La méthode view
Passons maintenant à la méthode view(). Nous voulons appeler http://localhost/article/view/2 et donc récupérer l'article d'id=2.
1 2 3 4 5 6 7 8 9 | public function view($id=1) { $article=new Article_Model($id); if($article->id== '' ) Event::run('system.404'); echo '<h1>'.$article->title.'</h1>'; echo ''.$article->text.''; } |
Le modèle est instancié avec l'id correspondant (2) et la requête de la récupération de l'article dans la base de données est immédiatement exécutée. Si aucun argument n'est donné, $id vaut 1. Si aucun article n'existe avec l'identifiant passé, par exemple $id=10, alors un évènement 404 est déclenché affichant ainsi une page 404. Sinon si l'article existe sont titre et son contenu sont affichés.
La méthode insert
C'est la méthode pour laquelle il y a le plus de travail.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function insert() { $form=new Forge(); $form->input('title')->label(true); $form->textarea('text')->label(true); $form->submit('Submit'); if($form->validate()) { $article=new Article_Model(); $article->title=$form->title->value; $article->text=$form->text->value; if($article->save()) { echo 'Saved'; } } else { echo $form->html(); } } |
Dans cet exemple, le module Forge de Kohana est utilisé pour construire le formulaire. Une fois le forme envoyé, il va être validé. Comme il n'y a aucune règles, la validation réussira. Ensuite, on crée un un nouvel article Article_Model et on affecte les valeurs de ses attributs grâce au contenu du formulaire (manipulation de l'objet $form). On fait enfin appel à la méthode save sur notre objet pour sauvegarder l'article dans la base de données.
Note: Aucune vérification n'est effectué sur les données entrées dans le formulaire, ceci n'est pas recommandé
Voilà c'est terminé pour les bases, comme vous pouvez le constater c'est assez simple.
Bonus
Imaginons que vous connaissez le titre d'un article et vous souhaitez rechercher l'article correspondant. Il vous suffit de faire:
1 2 3 4 5 6 | public function hello_world() { $article=new Article_Model; $article->find_by_title('Hello World'); echo $article->text; } |
Pour afficher le contenu de l'article.
Vous disposez aussi des méthodes find_all_by, find_by_title_and_text, find_by_title_or_text, find_related etc.. pour plus d'information consultez la documentation de la librairie ORM.
Comme annoncé, les relations ne sont pas couvertes. Cela fera peut être l'objet d'un article futur.