6 Hackeri CodeIgniter pentru maeștri

CodeIgniter este un cadru simplu și puternic de aplicații web open source pentru PHP. Astăzi, vom face niște "hacks" de bază în acest cadru pentru a-și schimba și îmbunătăți funcționalitatea. În acest proces, veți obține o mai bună înțelegere a complexității Codierii.

act de renunțare

  1. Nu se recomandă aplicarea acestor hack-uri la un proiect existent. Deoarece modifică unele dintre funcțiile de bază ale CodeIgniter, acesta poate rupe codul existent.
  2. Din această scriere, CodeIgniter 1.7.2 este ultima versiune stabilă. Aceste hack-uri nu sunt garantate pentru a lucra pentru emisiuni viitoare (sau trecute).
  3. Chiar dacă CodeIgniter este proiectat să fie compatibil cu PHP 4, unele dintre aceste hacks nu sunt. Deci, veți avea nevoie de un server cu PHP 5 instalat.
  4. Când efectuați modificări ale fișierelor din dosarul de sistem, ar trebui să le documentați undeva pentru referințe ulterioare. Data viitoare când actualizați CodeIgniter (chiar dacă nu difuzează actualizări foarte des), este posibil să fie nevoie să aplicați din nou aceste modificări.

1. Modele autoloading PHP 5 Style

Scopul

În partea stângă, vedeți modul regulat de încărcare a unui model în CodeIgniter, din cadrul unui controler. După acest hack, vom putea crea obiecte direct. Codul este mai curat și IDE-ul dvs. va putea recunoaște tipurile de obiecte. Aceasta permite activarea funcțiilor IDE, cum ar fi auto-completarea sau documentația de previzualizare.

Există încă două efecte secundare ale acestei hack-uri. În primul rând, nu mai este necesar să extindeți clasa Model:

Și nu mai trebuie să adăugați un apel requ_once înainte de a face moștenire clasă de model.

Hack-ul

Tot ce trebuie să faceți este să adăugați o funcție de autoloader în stilul PHP 5.

Adăugați acest cod în partea de jos a sistemului / application / config / config.php:

Dacă sunteți interesat să aplicați acest hack pentru controlori, puteți utiliza în schimb acest cod:

Ori de câte ori încercați să utilizați o clasă care nu este definită, această funcție __autoload este numită mai întâi. Se ocupă de încărcarea fișierului de clasă.

2. Preveniți coliziunea numelui controlerului modelului

Scopul

În mod normal, nu puteți avea același nume de clasă pentru un model și un controler. Să presupunem că ați creat un nume de model Post:

clasa Post extinde modelul // ...

Acum nu puteți avea o adresă URL ca aceasta:

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

Motivul se datorează faptului că ar necesita o clasă de controler numită "Postare". Crearea unei astfel de clase ar duce la o eroare fatală a PHP.

Dar cu această hack, va deveni posibil. Și controlerul pentru acea adresă URL va arăta astfel:

// aplicație / controlori / post.php clasa Post_controller extinde Controller // ...

Rețineți sufixul "_controller".

Hack-ul

Pentru a rezolva această problemă, în mod normal majoritatea oamenilor adaugă sufixul "_model" nume de clasă model (de ex. Post_model). Obiectele de obiecte sunt create și menționate pe toată aplicația, astfel încât s-ar părea un pic prost să aibă toate aceste nume cu "_model" plutitoare în jurul. Cred că este mai bine să adăugați un sufix controlorilor în loc, deoarece acestea nu sunt aproape niciodată menționate de numele lor de clasă în codul dvs..

Mai întâi trebuie să extindem clasa Router. Creați acest fișier: "application / libraries / MY_Router.php"

clasa MY_Router extinde CI_Router var $ suffix = '_controller'; funcția MY_Router () părinte :: CI_Router ();  funcția set_class ($ class) $ this-> class = $ class. $ This-> sufix;  funcția controller_name () if (strstr ($ this-> class, $ this-> suffix)) return str_replace ($ this-> suffix, ", $ this-> class); else return $ this-> class;

Acum editați "system / codeigniter / CodeIgniter.php" linia 153:

dacă (! fișier_există (APPPATH.'controllers /'.$ RTR-> fetch_directory (). $ RTR-> numele controlerului () EXT))

Același fișier, linia 158:

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

Apoi, editați: "system / libraries / Profiler.php", linia 323:

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

Asta e tot. Rețineți că, cu acest hack, trebuie să puneți sufixul "_controller" pe toate numele de clasă ale controlorului. Dar nu în numele fișierelor sau al adreselor URL.

3. Validarea formularului pentru valori unice

Scopul

CodeIgniter are o clasă frumoasă Form_validation. Acesta vine cu mai multe reguli de validare:

Acestea sunt utile, dar lipsește unul important din această listă: pentru a verifica valori unice. De exemplu, majoritatea formularelor de înregistrare ale utilizatorilor trebuie să verifice dacă numele de utilizator nu este deja utilizat sau adresa de e-mail nu se află deja în sistem.

Cu acest hack, veți putea adăuga foarte ușor această regulă de validare la formatorul de trimitere a formularului:

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

Rețineți ultima parte care spune "un nume [User.username]". Această nouă regulă de validare se numește doar "unică" și ia un parametru în paranteze pătrate, care este "tablename.fieldname". Astfel, va verifica coloana "nume de utilizator" din tabelul "Utilizator" pentru a vă asigura că valoarea trimisă nu există deja.

În mod similar, puteți verifica e-mailurile duplicate:

$ this-> form_validation-> set_rules ('email', 'E-mail', 'obligatoriu' valid_email 'unic [User.email]');

Aplicația dvs. poate răspunde cu mesaje de eroare adecvate:

Hack-ul

Acest lucru ar putea fi considerat mai degrabă o prelungire decât o hack. Cu toate acestea, vom lua o bibliotecă de bază CodeIgniter și o vom îmbunătăți.

Creați: "aplicație / biblioteci / MY_Form_validation.php"

clasa MY_Form_validation extinde CI_Form_validation funcția unică ($ value, $ params) $ CI = & get_instance (); $ CI-> a sarcinii> baze de date (); $ CI-> form_validation-> set_message ('unic', '% s este deja folosit.'); listă ($ table, $ field) = explode (".", $ params, 2); $ query = $ CI-> db-> selectați ($ field) -> din ($ table) -> unde ($ field, $ value) -> limit (1) -> get (); dacă ($ query-> row ()) return false;  altceva return true; 

Acum puteți utiliza regula unică de validare.

4. Rularea CodeIgniter din linia de comandă

Scopul

Asa cum spune si titlul, scopul nostru este sa putem rula aplicatii CodeIgniter din linia de comanda. Acest lucru este necesar pentru construirea de cron-uri sau pentru operațiuni mai intense, astfel încât să nu aveți limitările resurselor unui script Web, cum ar fi timpul maxim de execuție.

Acesta este aspectul pe mașina mea Windows locală:

Codul de mai sus ar fi ca sunând la această adresă URL:

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

Hack-ul

Creați un fișier "cli.php" la rădăcina folderului CodeIgniter:

dacă (isset ($ _ SERVER ['REMOTE_ADDR'])) die ('Numai linie de comandă!');  set_time_limit (0); $ _SERVER ['PATH_INFO'] = $ _SERVER ['REQUEST_URI'] = $ argv [1]; solicita dirname (__FILE__). '/Index.php';

Dacă sunteți într-un mediu Linux și doriți să faceți acest script auto-executabil, puteți adăuga aceasta ca prima linie în cli.php:

#! / Usr / bin / php

Dacă doriți ca un controler special să fie doar linia de comandă, puteți bloca apelurile web la constructorul de controler:

class Hello extinde controlerul function __construct () if (isset ($ _ SERVER ['REMOTE_ADDR'])) die ('Numai linie de comandă!');  părinte :: Controlor ();  // ...

5. Adăugarea doctrinei ORM la CodeIgniter

Scopul

Doctrina este un popular Object Relational Mapper pentru PHP. Prin adăugarea lui la CodeIgniter, puteți avea un strat de model foarte puternic în cadrul dvs..

Hack-ul

Doar instalarea doctrinei nu este foarte "hacky" în sine, așa cum o putem adăuga doar ca plug-in. Cu toate acestea, odată adăugată, clasele de model vor trebui să extindă clasele de bază Doctrine, în locul clasei Model CodeIgniter. Acest lucru va schimba complet modul în care stratul Model funcționează în cadru. Obiectele pe care le creați vor avea persistența bazei de date și, de asemenea, vor putea să aibă relații de bază de date cu alte obiecte.

Urmați acești pași:

  1. Creați dosar: aplicație / pluginuri
  2. Creați dosar: aplicație / pluginuri / doctrină
  3. Descarca Doctrina (1.2 din acest articol)
  4. Copiați dosarul "lib" din Doctrină în: "application / plugins / doctrine"
  5. Creați "aplicație / pluginuri / doctrine_pi.php"
// system / application / plugins / doctrine_pi.php // încărcare Doctrine library requ_once APPPATH. '/ plugins / doctrine / lib / Doctrine.php'; // încărcați configurația bazei de date din CodeIgniter require_once APPPATH. '/ config / database.php'; // aceasta va permite Doctrinei să încarce în mod automat clasele Modelului spl_autoload_register (array ('Doctrine', 'autoload')); // vom încărca conexiunile bazei noastre de date în Doctrine_Manager // această buclă ne permite să folosim mai multe conexiuni mai târziu în foreach ($ db ca $ connection_name => $ db_values) // mai întâi trebuie să convertim în format dsn $ dsn = $ db [$ numele conexiunii] ['dbdriver']. ': //'. $ db [$ conexiune_name] ['nume de utilizator']. ': ". $ Db [$ connection_name] [ 'parola']. '@'. $ db [$ nume_configurare] ['hostname']. '/'. $ Db [$ connection_name] [ 'bază de date']; Doctrine_Manager :: conexiune ($ DSN, $ connection_name);  // Clasa Modelului CodeIgniter trebuie să fie încărcată require_once BASEPATH. '/ Libraries / Model.php'; // spune Doctrina în care se află modelele noastre Doctrine :: loadModels (APPPATH. '/ models');

Apoi, editați "application / config / autoload.php" pentru a autologe acest plugin de Doctrină

$ autoload ['plugin'] = array ("doctrină");

De asemenea, asigurați-vă că aveți configurația bazei de date în "application / config / database.php".

Asta e tot. Acum puteți crea modele Doctrine în aplicația CodeIgniter. Citiți tutorialele mele despre acest subiect pentru mai multe informații.

6. Rularea site-urilor multiple

Scopul

Acest hack va permite pentru tine să ruleze mai multe site-uri dintr-o singură instalare de CodeIgniter. Fiecare site va avea propriul dosar de aplicație, dar toți vor avea același folder sistem.

Hack-ul

Instalați CodeIgniter oriunde pe server. Nu trebuie să fie sub un dosar de site web. Apoi scoateți dosarul aplicației din dosarul sistemului. Și faceți copii suplimentare, după cum vedeți în imaginea de mai sus, pentru fiecare site pe care doriți să îl rulați. Puteți plasa acele dosare de aplicații oriunde, cum ar fi în fiecare folder individual al site-urilor Web.

Acum, copiați fișierul index.php în rădăcina fiecărui folder web și editați-l după cum urmează:

La linia 26, puneți calea completă în dosarul de sistem:

 $ system_folder = dirname (__FILE__). "... / codigniter / sistem";

La linia 43, puneți calea completă la dosarul aplicației:

 $ application_folder = dirname (__FILE__). "... / application_site1";

Acum puteți avea site-uri web independente utilizând foldere separate de aplicații, dar puteți partaja același folder de sistem.

Există o implementare similară în Ghidul utilizatorului CodeIgniter pe care îl puteți citi, de asemenea.

7. Permiterea tuturor tipurilor de fișiere pentru încărcări

Scopul

Când utilizați biblioteca de încărcare în CodeIgniter, trebuie să specificați tipurile de fișiere acceptate.

$ This-> a sarcinii> bibliotecă ( 'încărcare'); $ This-> încăr-> set_allowed_types ( 'jpg | jpeg | gif | png | zip');

Dacă nu specificați niciun tip de fișier, veți primi un mesaj de eroare de la CodeIgniter: "Nu ați specificat niciun tip de fișier permis."

Deci, în mod implicit, nu există nicio modalitate de a permite încărcarea tuturor tipurilor de fișiere. Trebuie să facem o mică hack pentru a depăși această limitare. După aceasta, vom putea permite toate tipurile de fișiere prin setarea la "*".

$ This-> a sarcinii> bibliotecă ( 'încărcare'); $ This-> încăr-> set_allowed_types ( '*');

Hack-ul

Pentru acest hack vom schimba comportamentul clasei de încărcare.

Creați fișier: aplicație / biblioteci / My_Upload.php

clasa MY_Upload extinde CI_Upload function is_allowed_filetype () if (count ($ this-> allowed_types) == 0 OR! este_array ($ this-> allowed_types)) $ this-> set_error ('upload_no_file_types'); returnează FALSE;  dacă (in_array ("*", $ this-> allowed_types)) returnează TRUE;  $ image_types = array ('gif', 'jpg', 'jpeg', 'png', 'jpe'); foreach ($ this-> allowed_types ca $ val) $ mime = $ this-> mimes_types (strtolower ($ val)); // Imaginile primesc câteva verificări suplimentare dacă (in_array ($ val, $ image_types)) if (getimagesize ($ this-> file_temp) === FALSE) returnează FALSE;  dacă (is_array ($ mime)) if (in_array ($ this-> type_type, $ mime, TRUE)) return TRUE;  altceva if ($ mime == $ this-> file_type) return TRUE;  returnează FALSE; 

Concluzie

Sper că unele dintre acestea sunt utile pentru dvs. Dacă nu, acestea sunt încă interesante de știut și vă pot ajuta să aflați mai multe despre funcționarea internă a unui cadru și câteva dintre caracteristicile limbajului PHP.

Dacă știți alte hack-uri sau modificări interesante, anunțați-ne în comentarii. Mulțumesc!

  • Urmați-ne pe Twitter sau abonați la Nettuts + RSS Feed pentru cele mai bune tutoriale de dezvoltare web de pe web. Gata

Sunteți gata să vă abilitați la nivelul următor și să începeți să profitați de scripturile și componentele dvs.? Verificați piața sora noastră, CodeCanyon.

Cod