3.7.1 Comprendre les modèles

Un Modèle est à la fois votre modèle de données et, en programmation orientée objet, un objet qui représente une "chose", comme une voiture, une personne ou une maison. Un blog, par exemple, peut avoir plusieurs posts et chaque post peut avoir plusieurs commentaires. Blog, Post et Commentaire sont tous des exemples de modèles, chacun étant associé avec un autre.

Voici un simple exemple de définition de modèle dans CakePHP :

<?php

class Ingredient extends AppModel {
    var $name = 'Ingredient';
}

?>
  1. <?php
  2. class Ingredient extends AppModel {
  3. var $name = 'Ingredient';
  4. }
  5. ?>

Avec seulement une simple déclaration, le modèle Ingredient est doté de toutes les fonctionnalités dont vous avez besoin pour créer des requêtes, tout autant que sauvegarder et supprimer des données. Ces méthodes magiques proviennent de l'héritage du modèle CakePHP. Le modèle Ingredient étend le modèle de l'application AppModel, lequel étend la classe Model interne de CakePHP. C'est cette classe Model interne qui fournit les fonctionnalités à l'intérieur de votre modèle personnalisé "Ingredient".

La classe intermédiaire AppModel est vide et se trouve, par défaut, dans le répertoire /cake/. AppModel vous permet de définir des fonctionnalités qui doivent être rendues disponibles pour tous les modèles de votre application. Pour faire cela, vous avez besoin de créer votre propre fichier app_model.php qui se loge à la racine du /app/. A la création d'un projet en utilisant Bake ce fichier sera créer automatiquement pour vous.

Voyez aussi les Comportements (Behaviors), pour plus d'informations sur la façon d'appliquer une logique similaire à de multiples modèles.

Note : la propriété $name est nécessaire en PHP4 mais optionnelle en PHP5.

Une fois votre modèle défini, il peut être accédé depuis vos Contrôleurs. CakePHP rend automatiquement un modèle disponible en accès, dès lors que son nom valide celui du contrôleur. Par exemple, un contrôleur nommé IngredientsController initialisera automatiquement le modèle Ingredient et y accédera par $this->Ingredient.

<?php

class IngredientsController extends AppController {
    function index() {
        // Récupère tous les ingrédients et les transmet à la vue :
        $ingredients = $this->Ingredient->find('all');
        $this->set('ingredients', $ingredients);
    }
}

?>
  1. <?php
  2. class IngredientsController extends AppController {
  3. function index() {
  4. // Récupère tous les ingrédients et les transmet à la vue :
  5. $ingredients = $this->Ingredient->find('all');
  6. $this->set('ingredients', $ingredients);
  7. }
  8. }
  9. ?>

Les modèles associés sont disponibles à travers le modèle principal. Dans l'exemple suivant, Recette a une association avec le modèle Ingredient.

$this->Recette->Ingredient->find('all');
  1. $this->Recette->Ingredient->find('all');

Comme vous l'avez vu dans le chapitre Contrôleurs, vous pouvez attacher plusieurs modèles à un contrôleur et y accéder directement. Dans l'exemple suivant Recette et Utilisateur sont tous deux accessible depuis le contrôleur courant.

<?php
class RecetteController extends AppController {
    var $uses = array('Recette', 'Utilisateur');
    function index() {
       $this->Recette->find('all');
       $this->Utilisateur->find('all');
    }
}
?>
  1. <?php
  2. class RecetteController extends AppController {
  3. var $uses = array('Recette', 'Utilisateur');
  4. function index() {
  5. $this->Recette->find('all');
  6. $this->Utilisateur->find('all');
  7. }
  8. }
  9. ?>

Si vous n'avez pas ajouté de modèle via la propriété $uses, alors vous devrez l'importer manuellement et l'instancier depuis l'action.

<?php
class RecetteController extends AppController {
    var $uses = array('Recette');
    function index() {
       $this->Recette->find('all');

       App::import('Model', 'Utilisateur');
       $utilisateur = new Utilisateur();
       $utilisateur->find('all');
    }
}
?>
  1. <?php
  2. class RecetteController extends AppController {
  3. var $uses = array('Recette');
  4. function index() {
  5. $this->Recette->find('all');
  6. App::import('Model', 'Utilisateur');
  7. $utilisateur = new Utilisateur();
  8. $utilisateur->find('all');
  9. }
  10. }
  11. ?>