Pravljenje CodeIgniter biblioteka i helpera

Prilikom razvoja CodeIgniter aplikacije ne možemo se uvek oslanjati na biblioteke i helpere koji dolaze uz CI. Neophodno je napisati i razviti i sopstvene biblioteke i helpere, između ostalog da bi održali strukturu aplikacije jasnom i kod čitljivim.

Biblioteke

Biblioteke u CodeIgniter-u su klase koje sadrže klasne promenljive i metode koje se najčešće bave nekom određenom tematikom, kao na primer session bibilioteka koja služi za rad sa session-ima.
Metode, kao i klasne promenljive mogu biti public, koje je moguće pozivati iz drugih delova sistema, ili private, koje su samo za upotrebu unutar klase te biblioteke. Metode i klasne promenljive unutar neke klase često komuniciraju međusobno i tek kao skup daju željeni rezultat.

Iako se u CodeIgniter-u celokupna logika može teoretski pisati i u kontrolerima i u view fajlovima to nikako nije dobra ideja. Tek kada se logika aplikacije lepo razdvoji po celinama u biblioteke struktura programa postaje lako razumiljiva i jasna.

Kvalitetno razdvajanje po celinama omogućava lakšu i bržu nadogradnju aplikacije ili izmenu postojećih funkcionalnosti, omogućava da se neko sa strane lako snađe u takvom kodu i omogućava ponovno korišćenje tih funkcionalnosti u drugim projektima pukim kopiranjem fajla. Pored toga smanjuje mogućnost pravljenja velikih propusta u logici i bezbednosti aplikacije.

Banalan primer toga bi bila neka bibiloteka koja bi se bavila enkripcijom. Recimo da sve šifre za logovanje enkriptujete na neki način koji bude provaljen i postane nepouzdan. Umesto da prolazite sve modele i da svugde menjate način enkriptovanja, što bi oduzelo zaista mnogo vremena, dovoljno je samo na jednom mestu u jednom fajlu promeniti nekoliko karaktera. To postaje još očiglednija ušteda ako imate mnogo više od jednog projekta. Pored toga znate gde se šta nalazi i nakon mnogo vremena provedenog na raznim drugim projektima. Biblioteke koje se često koriste su prošle neophodne provere i znate kada ih koristite u sledećem projektu da će biti pouzdane.

Kvalitetno napisane biblioteke i njihova pravilna upotreba je često razlika izmedju programera početnika i iskusnijih. Ako želite da poboljšate svoj učinak i brzinu rada učenje kvalitetnog pisanja biblioteka je svakako pravi način.

Fajlovi koji sadrže biblioteke treba da budu u /applications/libraries folderu. Imenovanje ima sličan princip kao i imenovanje kontrolera. Imena fajlova treba da počnu velikim slovom i da odgovaraju imenu klase. Sledi primer na fajlu Test.php

class Test
{
	public  function zbir($x, $y)
	{
		return $x + $y;
	}
}

Učitavanje napravljenih biblioteka

Ako nam je napravljena biblioteka neophodna u nekom od kontrolera učitamo je sa $this->load->library(“ime_biblioteke”); i koristimo sa $this->ime_biblioteke->ime_funkcije(); što bi u ovom konkretnom primeru, ako želimo da izračunamo zbir 2 broja, izgledalo ovako:

$this->load->library(“test“);
echo $this->test->zbir(4, 5);

Ovaj primer će ispisati rezultat sabiranja brojeva 4 i 5.

Helperi

U CodeIgniter-u helperi su kolekcije funkcija koje imaju neku zajedničku tematiku. Razlika od biblioteka je što oni nemaju međusobnu komunikaciju. Svaka funkcija je sama za sebe dovoljna da obavi neki zadatak. Pored toga često se u helpere stavljaju funkcije koje je teško svrstati u neku od biblioteka, stavljaju se i funkcije koje su jedinstvene i za koje bi zaista bilo neprilično praviti klasu, u kojoj bi se samo ona nalazila.

Fajlovi koji sadrže helpere se nalaze u /applications/helpers folderu.

Napravimo recimo fajl colors_helper.php u kome je

function random_hex_color()
{
	$r = rand(128,255);
	$g = rand(128,255);
	$b = rand(128,255);
	$color = dechex($r) . dechex($g) . dechex($b);
	return "#".$color;
}

Naravno prilikom pravljenja veće aplikacije može se desiti da ste već napravili funkciju koja ima to ime, ili ako radite u većem timu može se desiti da više vas napravi funkciju sa istim imenom. Da to ne bi pravilo errore i prevelike glavobolje dobra je praksa koristiti PHP funkciju function_exists(). Ako funkcija sa prosleđenim imenom ne postoji vratiće false.

if(!functions_exists(“random_hex_color”))
{
	function random_hex_color()
	{
		$r = rand(128,255);
		$g = rand(128,255);
		$b = rand(128,255);
		$color = dechex($r) . dechex($g) . dechex($b);
		return "#".$color;
	}
}

CodeIgniter daje slobodu da se u helper fajlu napravi i klasa, ali to obično ne bi trebalo raditi, jer postoje biblioteke koje imaju tu strukturu. Tako napravljen, koristila bi se kao bilo kakva PHP klasa i to često nije praktično, ali može da pomogne, ako na primer želite već da napravljenu klasu u PHP-u bez izmena koristite.

Učitavanje i korišćenje napravljenih helpera

Kada učitamo u kontroleru helper putem $this->load->helper(“neki_helper”); moguće je pozvati funkciju sa naziv_funkcije();. U navedenom primeru to bi bilo:

$this->load->helper(“colors_helper”);
echo random_hex_color();

Dati primer bi prikazao nasumičnu boju u heksidecimalnom obliku.

Korišćenje CodeIgniter resursa u napravljenim bibliotekama i helperima

U predhodnim tekstovima sam pominjao da je bitno da kontroleri nasledjuju CI_Controller da bi mogli da koristimo pojedine CI funkcionalnosti. Tu spada izmedju ostaloga i korišćenje CI objekta. U bibliotekama i helperima koje napravimo njega nije moguće odmah koristiti, tako da $this->load->library(„neka_klasa“); neće raditi, tj. vratiće error.

Da bi mogli da koristimo CI super objekat (u kontrolerima, view fajlovima i modelima $this) u našim bibiliotekama moramo da inicijalizujemo u nekoj promenjivoj preko CodeIgniter funkcije get_instance().
Recimo da zelimo da napravimo funkciju koja vraca enkodovani string u helperu:

if(!function_exists("encode"))
{
	function encode($string)
	{
		$CI = & get_instance();
		$CI->load->library("encrypt");
		return $CI->encrypt->sha1($string);
	}
}

Dakle prvo moramo da uzmemo instancu CI super objekta u promenjivu ($CI je proizvoljno, ali najčešće se koristi). Onda umesto $this koristimo promenjivu u kojoj smo instancirali objekat, $CI u ovom slučaju, za učitavanje biblioteke za enkripciju i korišćenje njene funkcije.

Deo & označava da uzimamo referencu na objekat, što u konkretnom slučaju znači da se ne pravi kopija tog objekta, što je jako bitno da se ne bi usporavala aplikacija!

Još ponešto

CodeIgniter daje mogućnost da se napravljene biblioteke ekstenduju, kao i da ekstenduju neke druge klase, uključujući i core klase. Budući da je ovo ipak malo teže za razumevanje ostaviću za neki budući tekst.

Pored klase za enkripciju, sa CodeIgniter-om dolazi veliki broj drugih biblioteka i helpera. U narednom tekstu napraviću primer u kome ću koristiti još neke od njih.

Tagovi: