6 Hacks CodeIgniter pour les Masters

CodeIgniter est un framework d’applications Web open source simple et puissant pour PHP. Aujourd'hui, nous allons faire quelques "hacks" de base à ce framework pour changer et améliorer ses fonctionnalités. Ce faisant, vous comprendrez mieux les subtilités de CodeIgniter..

Avertissement

  1. Il n'est pas recommandé d'appliquer ces hacks à un projet existant. Comme ils modifient certaines fonctionnalités de base de CodeIgniter, cela peut casser le code existant..
  2. A ce jour, CodeIgniter 1.7.2 est la dernière version stable. Ces hacks ne sont pas garantis pour fonctionner pour les versions futures (ou passées).
  3. Bien que CodeIgniter soit conçu pour être compatible avec PHP 4, certains de ces hacks ne le sont pas. Vous aurez donc besoin d'un serveur avec PHP 5 installé.
  4. Lorsque vous modifiez les fichiers du dossier système, vous devez le documenter quelque part pour pouvoir le consulter ultérieurement. La prochaine fois que vous mettrez à niveau CodeIgniter (même s’ils ne publient pas très souvent les mises à jour), vous devrez peut-être appliquer à nouveau ces modifications..

1. Autoloading Models PHP 5 Style

Le but

Sur le côté gauche, vous voyez la manière habituelle de charger un modèle dans CodeIgniter, à partir d'un contrôleur. Après ce piratage, nous pourrons créer des objets directement. Le code est plus propre et votre IDE sera capable de reconnaître les types d'objet. Cela active les fonctionnalités de l'EDI telles que l'auto-complétion ou la documentation de prévisualisation.

Il y a deux autres effets secondaires de ce piratage. Tout d'abord, vous n'êtes plus obligé d'étendre la classe Model:

Et vous n'avez plus besoin d'ajouter un appel require_once avant de faire l'héritage de classe de modèle.

Le hack

Il suffit d'ajouter une fonction d'autoloader de style PHP 5..

Ajoutez ce code au bas de system / application / config / config.php:

Si vous souhaitez également appliquer ce hack aux contrôleurs, vous pouvez utiliser ce code à la place:

Chaque fois que vous essayez d'utiliser une classe qui n'est pas définie, cette fonction __autoload est appelée en premier. Il se charge de charger le fichier de classe.

2. Prévention de la collision nom de modèle-contrôleur

Le but

Normalement, vous ne pouvez pas avoir le même nom de classe pour un modèle et un contrôleur. Disons que vous avez créé un nom de modèle Post:

La classe Post étend le modèle //…

Maintenant, vous ne pouvez pas avoir une URL comme celle-ci:

http://www.mysite.com/post/display/13

La raison en est que cela nécessiterait que vous disposiez également d'une classe de contrôleur nommée "Post". La création d'une telle classe entraînerait une erreur PHP fatale.

Mais avec ce hack, cela deviendra possible. Et le contrôleur pour cette URL ressemblera à ceci:

// application / controllers / post.php class Post_controller étend Controller //…

Notez le suffixe '_controller'.

Le hack

Pour résoudre ce problème, la plupart des gens ajoutent normalement le suffixe «_model» aux noms de classe Model (par exemple, Post_model). Les objets de modèle étant créés et référencés dans toute l'application, il peut sembler un peu ridicule de laisser tous ces noms flotter avec «_model». Je pense qu'il est préférable d'ajouter un suffixe aux contrôleurs, car ils ne sont presque jamais référencés par leurs noms de classe dans votre code..

Nous devons d’abord étendre la classe Router. Créez ce fichier: "application / libraries / MY_Router.php"

la classe MY_Router étend CI_Router var $ suffix = = _controller '; fonction MY_Router () parent :: CI_Router ();  function set_class ($ class) $ this-> class = $ class. $ this-> suffixe;  function controller_name () if (strstr ($ this-> classe, $ this-> suffixe)) return str_replace ($ this-> suffixe, ", $ this-> classe); else return $ this-> classe;

Maintenant, éditez "system / codeigniter / CodeIgniter.php" ligne 153:

if (! file_exists (APPPATH.'controllers /'.$ RTR-> fetch_directory (). $ RTR-> controller_name (). EXT))

Même fichier, ligne 158:

include (APPPATH.'controllers /'.$ RTR-> fetch_directory (). $ RTR-> controller_name (). EXT);

Ensuite, éditez: "system / libraries / Profiler.php", ligne 323:

$ output. = "
". $ this-> CI-> router-> controller_name ()." / ". $ this-> CI-> router-> fetch_method ()."
";

C'est tout. Gardez à l'esprit qu'avec ce piratage, vous devez mettre le suffixe '_controller' sur tous les noms de classe de votre contrôleur. Mais pas dans les noms de fichiers ou les URL.

3. Validation de formulaire pour des valeurs uniques

Le but

CodeIgniter a une belle classe Form_validation. Il vient avec plusieurs règles de validation:

Celles-ci sont utiles, mais il en manque un important dans cette liste: vérifier les valeurs uniques. Par exemple, la plupart des formulaires d’enregistrement utilisateur doivent vérifier que le nom d’utilisateur n’est pas déjà utilisé ou que l’adresse électronique n’est pas déjà dans le système..

Avec ce hack, vous pourrez facilement ajouter cette règle de validation à votre gestionnaire de soumission de formulaire:

$ this-> form_validation-> set_rules ('username', 'username', 'required | alpha_numeric | min_length [6] | unique [User.username]');

Notez la dernière partie qui dit "unique [User.username]." Cette nouvelle règle de validation s'appelle simplement "unique" et prend un paramètre entre crochets, qui est "nomtable.nomjet". Donc, il va vérifier la colonne "nom d'utilisateur" de la table "Utilisateur" pour s'assurer que la valeur soumise n'existe pas déjà.

De même, vous pouvez vérifier les courriels en double:

$ this-> form_validation-> set_rules ('email', 'email', 'required | valid_email | unique [User.email]');

Et votre application peut répondre avec les messages d'erreur appropriés:

Le hack

Cela pourrait être considéré comme une extension plutôt qu'un hack. Néanmoins, nous allons prendre une bibliothèque principale CodeIgniter et l'améliorer.

Créer: "application / libraries / MY_Form_validation.php"

La classe MY_Form_validation étend CI_Form_validation function unique ($ value, $ params) $ CI = & get_instance (); $ CI-> charge-> base de données (); $ CI-> form_validation-> set_message ('unique', 'Le% s est déjà utilisé.'); list ($ table, $ field) = exploser (".", $ params, 2); $ query = $ CI-> db-> select (champ $) -> de (table $) -> où (champ $, $ valeur) -> limit (1) -> get (); if ($ query-> row ()) return false;  else retour vrai; 

Maintenant, vous pouvez utiliser la règle de validation unique.

4. Exécution de CodeIgniter à partir de la ligne de commande

Le but

Comme le titre l'indique, notre objectif est de pouvoir exécuter des applications CodeIgniter à partir de la ligne de commande. Cela est nécessaire pour la construction de tâches cron ou l'exécution d'opérations plus intensives afin d'éviter les limitations de ressources d'un script Web, telles que le temps d'exécution maximal..

Voici à quoi cela ressemble sur ma machine Windows locale:

Le code ci-dessus serait comme appeler cette URL:

http://www.mysite.com/hello/world/foo

Le hack

Créez un fichier "cli.php" à la racine de votre dossier CodeIgniter:

if (isset ($ _ SERVER ['REMOTE_ADDR']))) die ('Ligne de commande uniquement!');  set_time_limit (0); $ _SERVER ['PATH_INFO'] = $ _SERVER ['REQUEST_URI'] = $ argv [1]; require nom de répertoire (__ FILE__). '/index.php';

Si vous êtes dans un environnement Linux et que vous voulez rendre ce script auto-exécutable, vous pouvez l'ajouter à la première ligne de cli.php:

#! / usr / bin / php

Si vous souhaitez qu'un contrôleur spécifique soit uniquement en ligne de commande, vous pouvez bloquer les appels Web au niveau du constructeur du contrôleur:

class Hello étend le contrôleur function __construct () if (isset ($ _ SERVER ['REMOTE_ADDR']))) die ('Ligne de commande uniquement!');  parent :: Controller ();  //…

5. Ajouter Doctrine ORM à CodeIgniter

Le but

Doctrine est un mappeur d'objet relationnel populaire pour PHP. En l'ajoutant à CodeIgniter, vous pouvez avoir une couche de modèle très puissante dans votre framework..

Le hack

Installer Doctrine n’est pas très "hacky" en soi, nous pouvons simplement l’ajouter en tant que plug-in. Cependant, une fois ajoutées, vos classes Model devront étendre les classes de base Doctrine au lieu de la classe CodeIgniter. Cela modifiera complètement le fonctionnement de la couche Modèle dans la structure. Les objets que vous créez auront la persistance de la base de données et pourront également avoir des relations de base de données avec d'autres objets.

Suivez ces étapes:

  1. Créer un dossier: application / plugins
  2. Créer un dossier: application / plugins / doctrine
  3. Téléchargez Doctrine (1.2 à partir de cet article)
  4. Copiez le dossier "lib" de Doctrine dans: "application / plugins / doctrine"
  5. Créez "application / plugins / doctrine_pi.php"
// système / application / plugins / doctrine_pi.php // charge la bibliothèque Doctrine require_once APPPATH. '/ plugins / doctrine / lib / Doctrine.php'; // charge la configuration de la base de données depuis CodeIgniter require_once APPPATH. '/ config / database.php'; // ceci permettra à Doctrine de charger automatiquement les classes de modèle spl_autoload_register (array ('Doctrine', 'autoload')); // nous chargeons nos connexions de base de données dans Doctrine_Manager // cette boucle nous permet d'utiliser ultérieurement plusieurs connexions nom_connexion] ['dbdriver']. ': //'. $ db [$ nom_connexion] ['nomutilisateur']. ':'. $ db [$ nom_connexion] ['mot de passe']. '@'. $ db [$ nom_connexion] ['nomhôte']. '/' $ db [$ nom_connexion] ['base de données']; Doctrine_Manager :: connection ($ dsn, $ nom_connexion);  // La classe Model de CodeIgniter doit être chargée require_once BASEPATH. '/ Libraries / Model.php'; // indique à Doctrine où sont situés nos modèles Doctrine :: loadModels (APPPATH. '/ models');

Ensuite, éditez "application / config / autoload.php" pour charger automatiquement ce plugin Doctrine

$ autoload ['plugin'] = array ('doctrine');

Assurez-vous également que votre configuration de base de données est dans "application / config / database.php".

C'est tout. Vous pouvez maintenant créer des modèles de doctrine dans votre application CodeIgniter. Lisez mes tutoriels sur ce sujet pour plus d'informations.

6. Exécution de plusieurs sites

Le but

Ce hack vous permettra d’exécuter plusieurs sites à partir d’une seule installation de CodeIgniter. Chaque site Web aura son propre dossier d’application, mais tous partageront le même dossier système..

Le hack

Installez CodeIgniter n'importe où sur le serveur. Il n'a pas besoin d'être dans un dossier de site Web. Ensuite, retirez le dossier de l'application du dossier système. Et faites-en des copies supplémentaires, comme le montre l'image ci-dessus, pour chaque site Web que vous souhaitez exécuter. Vous pouvez placer ces dossiers d'application n'importe où, comme sous chaque dossier de site Web distinct..

Maintenant, copiez le fichier index.php à la racine de chaque dossier de site Web et éditez-le comme suit:

À la ligne 26, indiquez le chemin complet du dossier système:

 $ dossier_système = nom du répertoire (__ FILE__). «… / Codeigniter / system»;

À la ligne 43, indiquez le chemin complet du dossier de l’application:

 $ application_folder = nom de répertoire (__ FILE__). '… / Application_site1';

Vous pouvez maintenant avoir des sites Web indépendants utilisant des dossiers d’application distincts, mais partageant le même dossier système..

Il existe une implémentation similaire dans le Guide de l'utilisateur de CodeIgniter que vous pouvez lire également.

7. Autoriser tous les types de fichiers pour les téléchargements

Le but

Lorsque vous utilisez la bibliothèque de téléchargement dans CodeIgniter, vous devez spécifier les types de fichiers autorisés..

$ this-> load-> library ('upload'); $ this-> upload-> set_allowed_types ('jpg | jpeg | gif | png | zip');

Si vous ne spécifiez aucun type de fichier, CodeIgniter vous enverra un message d'erreur: "Vous n'avez spécifié aucun type de fichier autorisé."

Donc, par défaut, il n’ya aucun moyen d’autoriser le téléchargement de tous les types de fichiers. Nous devons faire un petit bidou pour contourner cette limitation. Après cela, nous pourrons autoriser tous les types de fichiers en le définissant sur '*'.

$ this-> load-> library ('upload'); $ this-> upload-> set_allowed_types ('*');

Le hack

Pour ce hack, nous allons modifier le comportement de la classe Upload.

Créer un fichier: application / libraries / My_Upload.php

La classe MY_Upload étend CI_Upload function is_allowed_filetype () if (count ($ this-> allowed_types) == 0 OU! is_array ($ this-> allowed_types)) $ this-> set_error ('upload_no_file_types'); retourne FALSE;  if (in_array ("*", $ this-> allowed_types)) return TRUE;  $ image_types = array ('gif', 'jpg', 'jpeg', 'png', 'jpe'); foreach ($ this-> allowed_types as $ val) $ mime = $ this-> mimes_types (strtolower ($ val)); // Les images reçoivent quelques vérifications supplémentaires if (in_array ($ val, $ image_types))   if (is_array ($ mime)) if (in_array ($ this-> type_fichier, $ mime, TRUE)) return TRUE;  else if ($ mime == $ this-> type_fichier) return TRUE;  return FALSE; 

Conclusion

J'espère que certains d'entre eux vous seront utiles. Sinon, ils sont toujours intéressants à connaître et peuvent vous aider à en apprendre davantage sur le fonctionnement interne d'un framework et sur certaines des fonctionnalités de base du langage PHP..

Si vous connaissez d'autres modifications ou modifications intéressantes, faites-le nous savoir dans les commentaires. Je vous remercie!

  • Suivez-nous sur Twitter ou abonnez-vous au fil RSS Nettuts + pour obtenir les meilleurs tutoriels de développement Web sur le Web. Prêt

Êtes-vous prêt à faire évoluer vos compétences et à commencer à tirer profit de vos scripts et de vos composants? Découvrez notre marché jumeau, CodeCanyon.