jeudi 23 février 2012

codeigniter

Etendre CodeIgniter : MY_Model

J’ai abordé dans un précédent billet le concept du MY_Controller qui vous permet de modifier le comportement de tous vos contrôleurs. Dans la même veine, je me propose de vous expliquer comment étendre simplement les fonctionnalités de CI_Model grace à MY_Model. Dans ce billet nous allons voir que nous pouvons automatiser (et oui encore un peu de DRY et de CoC) un certain nombre de méthodes d’accès aux données dans la veine du « Create Read Update Delete » (CRUD).

Dans un premier temps, vous allez créer un fichier MY_Model dans le répertoire /application/core/ et vous ajoutez le code suivant :

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Model extends CI_Model {

    protected $table;

    public function __construct() {
        parent::__construct();
        $this->load->helper('inflector');
        $this->table = get_class($this);
        $this->table = substr($this->table, 0, -6);
        $this->table = strtolower(plural($this->table));
    }

}

/* End of file MY_Model.php */
/* Location: ./application/core/MY_Model.php */

Mouais, c’est bien Ludal mais ça sert à quoi ? Ben mon bon ami, il s’agit tout simplement de récupérer le nom de la table de la base de données automatiquement. Petite explication : soit une table en base qui se nomme pfx_users (pfx_ correspondant au prefixe configuré pour votre base de données), et un modèle  dans mon application qui se nomme user_model. Ce même modèle étend directement ma classe MY_Model, donc au moment ou j’instancie ma classe, je connais déjà le nom de la table en base de donnée. En gros le constructeur prend le nom de la classe en cours, auquel il retranche 6 (la longueur du suffixe _model) et qu’il transforme au pluriel grâce au helper inflector. Tout cela est rendu possible en suivant des conventions de nommage de tables et donc de modèles. Pour résumer, le nom d’une table correspond au nom pluriel du type d’enregistrement (users, members, logs, statistics…), et le nom du modèle correspond lui au nom singulier du type d’enregistrement (user, member, log, statistic…). Tous les noms sont en anglais, j’y reviendrai dans un autre billet.

Bon maintenant que nous avons le nom de la table, c’est bien beau, mais ça sert à quoi ? Nous allons voir dans l’exemple suivant l’utilité de notre nom de table. Nous souhaitons pouvoir supprimer tous les enregistrements d’une table, nous allons donc créer un modèle et un contrôleur dans cette unique but, mais en premier lieu, il faut modifier le code de MY_Model :

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Model extends CI_Model {

    protected $table;

    public function __construct() {
        parent::__construct();
        $this->load->helper('inflector');
        $this->table = get_class($this);
        $this->table = substr($this->table, 0, -6);
        $this->table = strtolower(plural($this->table));
    }

    public function truncate() {
        $this->db->truncate($this->table);
    }

}

/* End of file MY_Model.php */
/* Location: ./application/core/MY_Model.php */

Ensuite créons le modèle user_model

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class User_model extends MY_Model { 

}

/* End of file user_model.php */
/* Location: ./application/models/user_model.php */

Voilà, désormais tous les modèles disposent d’une méthode truncate() à laquelle je n’ai pas besoin de passer de paramètres, tout est automatique. Voyons juste comment utiliser cette méthode dans un contrôleur :

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Home extends CI_Controller { 

    public function index() {
        $this->load->model('user_model');
        $this->user_model->truncate();
    }

}

/* End of file home.php */
/* Location: ./application/controllers/home.php */

C’est enfin terminé, vous ne voyez pas forcément l’utilité sur une méthode aussi simple que truncate(), cependant à l’usage on peut rajouter pas mal de méthodes utiles que nous verrons dans un prochain billet. Le but est de disposer de fonctions communes, et de faciliter la maintenabilité du code.

Télécharger le code source

À propos de l'auteur

Passionné d'informatique en général et de logiciel libre en particulier. Développeur sur de multiples langage & IDE (Delphi, .net, Java, PHP...). Administrateur de la communauté francophone de la distribution LinuxMint. Amoureux du développement sur CodeIgniter et à la recherche d'un associé (graphiste de préférence) pour monter un Business Model :-)

Autres articles par Ludal »

2 commentaires

  • Frédéric MORIN | 26 janvier 2012 à 18 h 30 min | Répondre

    Si j’ai une table entities la classe modèle sera Entity_model ou Entitie_model ?

    • Ludal | 26 janvier 2012 à 23 h 08 min

      En gros le helper comporte une série de règles pour le plural() et le singular() qui permet de répondre à la plupart des cas « classiques » donc ce sera bien Entity_model.
      Si la méthode plural() ou singular() ne répond pas au besoin, il suffit de modifier la méthode dans /application/helper/MY_inflector.php, c’est comme pour le reste, tout peut être facilement modifiable.
      Une autre solution que je n’aborde pas ici, c’est cette fameuse variable $table, si le nom de la table est exotique et ne rentre pas dans les cas du helper plural(), il suffit d’ajouter dans le constructeur du modèle la ligne suivante :
      $this->table = 'ma_table_exotique';
      Et c’est ça rejoint ce que j’explique sur CoC, c’est à dire que l’on code par exception ! la convention c’est le nommage des tables et des modèles, l’exception c’est une table exotique ;-)
      Pinaise je retombe sur mes pattes :D

Laisser un commentaire

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="">

Envoyer le commentaire »

Propulsé par WordPress