Models (Modèles)

Les Models sont les classes qui représentent la couche de logique dans votre application. Ils sont responsables de la gestion de presque tout ce qui concerne les données, leur validité, les interactions et l’évolution du flux d’informations dans votre domaine de travail.

Habituellement, les classes de model représentent les données et sont utilisées dans les applications CakePHP pour l’accès aux données, plus spécifiquement elles représentent une table de la base de données, mais elles ne sont pas limitées à cela et peuvent être utilisées pour accéder à tout ce qui manipule des données comme des fichiers, des services web externes, des évènements iCal.

Un model peut être associé avec d’autres models. Par exemple, une Recette peut être associée avec l’Auteur de la recette ainsi qu’à un Ingredient.

Cette section vous expliquera quelles fonctionnalités du model peuvent être automatisées, comment outrepasser ces fonctionnalités, et quelles méthodes et propriétés un model peut avoir. Elle expliquera les différentes façons d’associer vos données. Elle décrira comment trouver, sauvegarder, et effacer des données. Au final, elle s’intéressera aux sources de données.

Comprendre les Models

Un Model représente votre model de données. En programmation orientée objet, un model est 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 models, chacun étant associé avec un autre.

Voici un exemple simple de définition de model dans CakePHP:

App::uses('AppModel', 'Model');
class Ingredient extends AppModel {
    public $name = 'Ingredient';
}

Avec juste cette simple déclaration, le model Ingredient est doté de toutes les fonctionnalités dont vous avez besoin pour créer des requêtes, ainsi que sauvegarder et supprimer des données. Ces méthodes magiques proviennent de la classe Model de CakePHP, grâce à la magie de l’héritage. Le model Ingredient étend le model de l’application AppModel, lequel étend la classe Model interne de CakePHP. C’est cette classe Model du cœur qui fournit les fonctionnalités à l’intérieur de votre model Ingredient. App::uses('AppModel', 'Model') s’assure que le model est chargé sans effort quand cela est nécessaire.

La classe intermédiaire AppModel est vide. Si vous n’avez pas créé la vôtre, elle provient du répertoire du coeur de cakePHP. Ecraser AppModel vous permet de définir des fonctionnalités qui doivent être rendues disponibles pour tous les models de votre application. Pour faire cela, vous avez besoin de créer votre propre fichier AppModel.php qui se loge dans le dossier Model, comme tous les autres models de votre application. À la création d’un projet en utilisant Bake, ce fichier sera automatiquement créé pour vous.

Voir aussi Behaviors pour plus d’informations sur la façon d’appliquer la même logique pour de multiples models.

Revenons-en à notre model Ingredient. Pour que cela fonctionne, créez le fichier PHP dans le repertoire /app/Model/. Par convention, il devra avoir le même nom que la classe ce qui pour l’exemple sera Ingredient.php.

Note

CakePHP créera dynamiquement un objet model pour vous si il ne peut pas trouver un fichier correspondant dans /app/Model. Cela veut également dire que si votre fichier de model n’est pas nommé correctement (par ex si il est nommé ingredient.php ou Ingredients.php plutôt que Ingredient.php) CakePHP utilisera une instance de AppModel, plutôt que votre fichier de model (qui sera manquant pour CakePHP). Si vous essayez d’utiliser une méthode que vous avez définie dans votre model ou dans un comportement attaché à votre model et que vous obtenez des erreurs SQL qui indiquent le nom de la méthode que vous appelez, c’est une indication certaine que CakePHP ne peut pas trouver votre model et que vous devez vérifier les noms de fichier, nettoyer les fichiers temporaires ou les deux.

Note

Certains noms de classe ne sont pas utilisables pour les noms de model. Par exemple, « File » ne peut pas être utilisé puisque « File » est une classe existant déjà dans le coeur de CakePHP.

Une fois que votre model est défini, il est accessible depuis vos Controllers. CakePHP rend automatiquement un model disponible en accès, dès lors que son nom correspond à celui du controller. Par exemple, un controller nommé IngredientsController initialisera automatiquement le model Ingredient et y accédera par $this->Ingredient:

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

Les models associés sont accessibles à travers le model principal. Dans l’exemple suivant, Recette a une association avec le model Ingredient:

class Recette extends AppModel {

    public function steakRecipes() {
        $ingredient = $this->Ingredient->findByName('Steak');
        return $this->findAllByMainIngredient($ingredient['Ingredient']['id']);
    }
}

Cela montre comment utiliser les models qui sont déjà liés. Pour comprendre comment les associations sont définies, allez voir la Section des associations.