CodeIgniter is een open source applicatie-framework voor webtoepassingen. Het is gericht op ontwikkelaars die snelheid verkiezen boven uitgebreide functionaliteit. Volgens de officiële projectpagina is het belangrijkste ontwerpdoel van dit PHP-framework een maximum aan prestaties en flexibiliteit in het kleinst mogelijke kader te plaatsen.
CodeIgniter is een PHP-gebaseerd web-framework dat beschikt over een compact softwareontwerp waarmee je snel en efficiënt webapplicaties kunt ontwikkelen. CodeIgniter werd opgericht door het Amerikaanse softwarebedrijf EllisLab, dat in februari 2006 de eerste openbare versie uitbracht. Op 9 juli 2013 kondigde EllisLab aan dat het niet langer in staat was om de benodigde middelen voor de verdere ontwikkeling van de software op eigen kracht in te zamelen. Een jaar later werd het project overgenomen door het British Columbia Institute of Technology (BCIT).
De broncode van het framework valt onder de MIT-licentie en is verkrijgbaar via de online service GitHub. De laatste stabiele versie van CodeIgniter 3.1.2 is sinds oktober 2016 gratis te downloaden op de officiële projectpagina.
Het prestatiegerichte ontwerp van de CodeIgniter wordt weerspiegeld in de slanke structuur van het PHP-framework. Dit is gebaseerd op de softwarearchitectuur Model View Controller (MVC). Het basisprincipe achter MVC is de strikte scheiding van programmacode en presentatie. Dit wordt gerealiseerd door een modulaire softwarestructuur en de uitbesteding van PHP-code. Er zijn drie centrale componenten: het datamodel (model), de presentatie (view) en de controller.
De MVC-structuur maakt een flexibel softwareontwerp mogelijk, waarbij afzonderlijke programmamodules met minimale inspanning kunnen worden vervangen, herzien en hergebruikt. Wijzigingen aan een component hebben doorgaans geen effect op de broncode van andere componenten (mits er geen wijzigingen in de interfaces worden aangebracht).
De strikte scheiding tussen programmalogica en presentatie zorgt voor een duidelijke, goed gestructureerde programmacode. Webtoepassingen op basis van MVC worden beschouwd als onderhoudsvriendelijk. Wanneer er een fout optreedt, hoef je meestal maar in één van de componenten naar de oorzaak te zoeken.
Bovendien biedt het MVC-architectuurpatroon de mogelijkheid om logica en lay-out van een webapplicatie afzonderlijk te ontwikkelen. Als backend en frontend-ontwikkelaars parallel werken, kunnen applicaties veel sneller worden voltooid.
CodeIgniter gebruikt MVC, maar bindt gebruikers niet volledig aan dit architectonische patroon. Terwijl Controller en View verplichte componenten zijn, zijn interfaces naar databanken via Model optioneel. Bovendien kan een toepassing op basis van het CodeIgniter framework ook worden geïmplementeerd met een Hierarchical-MVC-architectuur (HMVC) die het klassieke MVC-patroon uitbreidt met een hiërarchische logica.
CodeIgniter is gebaseerd op een URL-concept. Dit betekent dat de controller als centrale regeleenheid tussen de view en het model wordt aangesproken door een URL in te voeren in de zoekbalk van de webbrowser. Ontwikkelaars creëren hiervoor zogenaamde controllerklassen. Dit zijn PHP-bestanden die verschillende functies bevatten voor het laden van bibliotheken, extensies (plug-ins) of helpers (helper), het verbinden met databases, de integratie van een datamodel of het zoeken naar een specifieke view.
De applicatiestroom van de CodeIgniter is gebaseerd op het volgende URL-basisschema:
example.com/class/function/parameter
Het domein (example.com) wordt gevolgd door een te adresseren controller-klasse en een specifieke controller-functie. De parameters zijn optioneel en worden gebruikt om ID's of variabelen door te geven aan de geselecteerde controller.
In de praktijk zou een CodeIgniter URL er als volgt uit kunnen zien:
example.com/news/article/511
Een dergelijke URL adresseert de controller news op het domein example.com en zorgt ervoor dat deze de functie article uitvoert (bijvoorbeeld om een view met dezelfde naam te laden voor de artikelweergave). Optionele parameters die met de URL aan de controller worden meegegeven, tonen welke inhoud via het datamodel uit de database moet worden opgevraagd - in dit voorbeeld een artikel met ID 511.
In de uitgangsconfiguratie toont CodeIgniter de index.php in elke URL van de applicatie:
example.com/index.php/news/article/511
Dit PHP-bestand bevat informatie over de locatie van de kernbestanden, bibliotheken, extensies of helpersklassen in het framework, evenals de directory waarin de applicatiebestanden zich bevinden. Het bestand index.php wordt dus gebruikt om alle basisbronnen te initialiseren.
Als CodeIgniter op een Apache HTTP-server draait, kun je index.php via mod_rewrite verwijderen uit de URL's van de applicatie om zo 'schone' webadressen aan eindgebruikers en crawlers van zoekmachines te tonen. Ontwikkelaars gebruiken hiervoor deze code in het .htaccess-bestand van de webserver:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
De basisstructuur van het PHP framework is gebaseerd op controllerklassen, modelklassen en view templates.
CodeIgniter biedt ontwikkelaars de mogelijkheid om controllers als gebruiker gedefinieerde klassen te programmeren. Voor dit doel creëren webontwikkelaars een apart PHP-bestand voor elke controller in de directory application/controllers. Controllers bevatten de programmalogica van een webapplicatie die met het CodeIgniter framework is ontwikkeld en worden als subklassen van CI_Controller class aangemaakt. In de broncode doen programmeurs dit met behulp van het trefwoord extends.
class News extends CI_Controller {
}
Als subklasse krijgt News van de bovenliggende klasse CI_Controller alle zichtbaarheidseigenschappen van de functies public en protected.
Tip: De trefwoorden public, protected en private worden in PHP gebruikt om de zichtbaarheid van een eigenschap of functie te definiëren. Als een element public wordt verklaard, hebben alle klassen van een software toegang tot het element. Als je deze toegang wilt beperken tot ouderklassen en afgeleide klassen, gebruik je het trefwoord protected. Een element dat als private wordt verklaard, is alleen beschikbaar voor de klasse die het element definieert.
Elke klasse van aangepaste controllers moet ook een constructorfunctie bevatten waarmee je bibliotheken, een datamodel, databanken of helperklassen kunt integreren. Vanaf PHP5 wordt __construct() gebruikt als een gestandaardiseerde constructorfunctie.
<?php
class News extends CI_Controller {
public function __construct() { //definieert de constructor
parent::__construct(); //roept de constructor van de bovenliggende klasse op
$this->load->helper('url'); //laadt een helperklasse voor het werken met URLs
$this->load->helper('file'); //laadt een helperklasse voor het werken met bestanden
$this->load->database(); //laadt een database
$this->load->model('News_model'); //laadt odel „News_model“
}
?>
Het voorbeeld toont de klasse News als subklasse van CI_Controller. De bouwerfunctie __construct () integreert twee helperklassen, een database en het datamodel News_model. De individuele regels van de code worden toegelicht in de broncode.
Let op: alle controllerklassen gedefinieerd in PHP voor CodeIgniter moeten beginnen met een hoofdletter (News in plaats van news). In de URL worden ze echter in kleine letters geschreven.
Als de basisstructuur van de door de gebruiker gedefinieerde controller is gedefinieerd, volgt de eigenlijke programmalogica in de vorm van controllerfuncties waarmee je views of interacties met een geïntegreerd datamodel kunt realiseren.
Om de controller in staat te stellen een view te laden, moet het onderliggende HTML-document als PHP-bestand in de directory application/views staan. Een eenvoudige view voor een artikelweergave luidt bijvoorbeeld als volgt:
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<title><?php echo $title; ?></title>
</head>
<body>
<h1><?php echo $headline ?></h1>
<p><?php echo $content_body ?></p>
</body>
</html>
Tip: HTML-documenten met PHP-code moeten als PHP-bestanden (. php) worden opgeslagen. Dit is de enige manier om ervoor te zorgen dat de PHP-interpreter van de webserver scripts uitvoert en niet zomaar de PHP-code als tekst weergeeft.
Om een view in de controller te laden, is een door de gebruiker gedefinieerde functie vereist. In het volgende codevoorbeeld wordt de functie arti() gebruikt om de View article.php te laden.
public function article() {
if (!file_exists(application/views/article.php)) {
show_404();
}
$this->load->view('article');
}
De programmacode luidt als volgt: eerst controleert CodeIgniter of de directory application/views/ een bestand met de naam artil.php bevat. Deze query wordt gerealiseerd door de taalconstructie if en de negatieve (!) conditie file exists().
Als aan de voorwaarde is voldaan en er geen bestand met dezelfde naam in de corresponderende directory staat, geeft if de waarde TRUE en CodeIgniter start de onder if vermelde functie show_404(). In dit geval zou een gebruiker ervan in kennis worden gesteld dat het gevraagde bestand niet bestaat. Als niet aan de voorwaarde is voldaan en !file_exists als FALSE wordt geëvalueerd, voert CodeIgniter de functie $this->load->view (‘article') uit. Deze wordt gebruikt om het corresponderende bestand als view in de applicatie te laden.
Als het bestand in PHP-formaat is, kan het gewenste bestand zonder suffix in de view()-functie worden uitgevoerd. Als er andere formaten nodig zijn, is het betreffende achtervoegsel verplicht.
CodeIgniter wordt meestal gebruikt in dynamische webapplicaties. In plaats van statische HTML-pagina's kunnen gebruikers dynamisch gegenereerde webpagina's afspelen. Dit gebeurt door de view te vullen met gegevens die overeenkomen met de parameters die CodeIgniter via de URL krijgt.
example.com/news/article/511
Voorheen werd de $this->load->load->view('article') functie alleen gebruikt om een view te laden voor de itemweergave. Nu is het belangrijk om de inhoud gekoppeld aan parameter 511 te integreren. We gaan ervan uit dat dit een ID is die door middel van een databasemanagementsysteem gekoppeld is aan een bepaald nieuwsartikel. Om deze uit de database in het programma te laden, moet je bovenstaand voorbeeld zodanig aanvullen dat het in de constructor geïntegreerde gegevensmodel wordt aangesproken.
public function article($id) {
if (!file_exists(application/views/article.php)) {
show_404();
}
$data = $this->News_model->get_data($id);
$this->load->view('article', $data);
}
Het geleverde functieargument (hier onder de variabele naam $id) komt overeen met het ID gedeelte van de URL - bijvoorbeeld 511. De nog te schrijven modelfunctie get_data () is nodig om de artikelinhoud van de ID uit de database te halen. De view()-methode roept de article-weergave op en geeft deze gegevens door in de vorm van een associatieve array ($data). Het datamodel News_model verzendt de gelezen gegevens daarom naar de controller News, die deze aan de view doorgeeft.
Het datamodel voert alle handelingen uit die horen bij het opvragen van data.
CodeIgniter gebruikt datamodellen om functies te leveren die het mogelijk maken bepaalde databasebewerkingen uit te voeren. Net als controllerklassen kun je modelklassen via het PHP-framework naar wens programmeren.
Om een modelklasse te maken, voer je eerst een klassenaam in - in dit geval News_model. Analoog aan de controllerklassen zijn alle gebruikersgedefinieerde modelklassen een subklasse van de ouderklasse CI_Model. Dit dankzij het keyword extends. Modelklassen omvatten ook databases en andere bronnen via de constructorfunctie.
class News_model extends CI_Model {
public function __construct() {
parent::__construct();
$this->load->database();
}
}
De zogeheten modelfuncties volgen deze basisstructuur. In deze functies definiëren ontwikkelaars alle databasebewerkingen die via het betreffende datamodel voor de controller beschikbaar moeten zijn.
Modelklassen stellen ontwikkelaars in staat om individuele functies te definiëren voor databasetransacties. In een vorig voorbeeld gebruikten we de gebruikersgedefinieerde functie get_data() in de controllerklasse News om artikelinhoud uit de database in de view te laden. In het model definiëren we nu welke databasebewerkingen achter deze functie verborgen zijn.
class News_model extends CI_Model {
public function __construct() {
parent::__construct();
$this->load->database();
}
public function get_data($id) {
$this->db->select('content');
$this->db->from('example_table');
$this->db->where('id', $id);
$query = $this->db->get();
return $query->result();
}
In de modelklasse News_model wordt de hierboven gebruikte get_data ()-functie gedefinieerd als een databasebewerking. Deze vraagt de dataset op die onder de bij select() aangegeven kolom staat, met het ID-nummer ($id) uit de databasetabel. Dit gebeurt via get(). Het resultaat verschijnt als array via de functie result().
Een datamodel biedt meestal een verscheidenheid aan modelfuncties. Ontwikkelaars kunnen gebruikmaken van de Query Builder-klasse, die vooraf gedefinieerde functies bevat voor klassieke databasebewerkingen. Een overzicht vind je in de officiële documentatie van het CodeIgniter-framework.
CodeIgniter gebruikt een URL om aan te geven welke controllerklasse en -functie moet worden geadresseerd. Het framework gebruikt hiervoor de URL-structuur klasse/functie/parameters. Je kunt dit basisschema naar wens aanpassen. CodeIgniter stelt hiervoor het bestand routes.php in de directory application/config/ ter beschikking. Dit bevat een array genaamd $-route, waarmee je als ontwikkelaar je eigen routing-criteria kunt definiëren.
De $-route-array bevat drie standaardwaarden in de uitgangsconfiguratie: de standaard controller, een routeringsregel voor de 404-override-regel en een regel voor het automatisch vervangen van koppeltekens (-) door underscores (_).
$route['default_controller'] = 'home/welcome';
$route['404_override'] = 'home/welcome';
$route['translate_uri_dashes'] = FALSE;
De eerste default-invoer bepaalt de standaardcontroller van de applicatie. CodeIgniter laadt dit bestand wanneer een URL alleen het domein bevat, geen extra routinginformatie. In het huidige voorbeeld definieert de routingregel de controllerklasse home als standaardcontroller. Bezoekers die geen informatie over de doelpagina in de URL verstrekken, worden doorgestuurd naar home en krijgen de view welcome te zien. Meestal is dit een forward naar de startpagina. Als er geen controller is gedefinieerd als standaardinstelling, geeft CodeIgniter een 404-foutpagina weer wanneer de startpagina wordt opgeroepen.
Let op: websites met veel 404-foutpagina's zijn moeilijk te crawlen. Zoekmachines hebben dan moeite om relevante content te vinden. Dit kan – naast de impact op de gebruikerservaring – een negatieve invloed hebben op de positie in de zoekmachine. Daarom proberen webbouwers 404-foutpagina’s zo veel mogelijk te vermijden, door gebruik te maken van domeinomleidingen, bijvoorbeeld met behulp van een rewrite engine.
De tweede default-invoer in de $route-array definieert een controller die wordt opgeroepen wanneer de aanvankelijk door de URL geadresseerde controller niet in de applicatiebestanden aanwezig is. De routingsregel $route[' 404_override] =' home' overschrijft de 404-foutpagina die gewoonlijk in zo’n situatie verschijnt. In plaats daarvan is een omleiding naar de controllerklasse home actief.
De derde default-invoer in de $route-array voorkomt routingsfouten door koppeltekens. Het koppelteken is geen geldig teken voor klasse- of functienamen en wordt daarom al in de standaardinstelling automatisch vervangen in URL's.
Wil je een aangepaste routing-regel maken voor een dynamische URL? Dan kun je als webontwikkelaar met CodeIgniter twee opties gebruiken: wildcards of ‘gewone’ regels.
Routes.php kent twee soorten wildcards:
Wildcards van routes.php | Omschrijving |
---|---|
:num | Is een placeholder voor een integer (volledige getal) |
:any | Is een placeholder voor een string (serie tekens) |
Dit voorbeeld toont een regel in routes.php waarmee je de functie (article) verwijdert uit de URL:
$route['news/article/(:num)'] = 'news/$1';
Via de wildcard :num wordt de parameter van een dynamische URL uitgelezen en opgeslagen in de variabele $1. Maak je routingregels met :num of :any, dan moet je die in routes.php tussen haakjes zetten.
In routes.php zijn ook routingregels in de vorm van gewone tekst toegestaan. Je kunt de wildcards daarmee ook als volgt gebruiken:
:num entspricht \d+
:any entspricht [^/]+
Deze schrijfwijze is dus een alternatief voor het bovenstaande voorbeeld:
$route['news/article/(\d+ )'] = 'news/$1';
Ook reguliere uitdrukkingen worden in routes.php tussen haakjes geplaatst.
De flow van een toepassing op basis van CodeIgniter in zeven stappen:
Met meer dan 13.000 sterren is CodeIgniter een veelgeprezen ontwikkelingsproject van GitHub. Het staat op de derde plaats in de lijst van populairste PHP-frameworks. Maar net als elke andere software heeft CodeIgniter voor- en nadelen. We zetten ze graag op een rij, zodat je zelf kunt beslissen of dit slanke PHP-framework voor jou als webontwikkelaar geschikt is.
De ontwikkeling van het CodeIgniter-framework stagneerde tijdelijk voordat het door het BCIT werd overgenomen. Daarom zoeken ontwikkelaars in CodeIgniter vaak tevergeefs naar technologische ontwikkelingen die bij vergelijkbare frameworks over de afgelopen jaren wel toegevoegd zijn.
In deze tabel zie je de belangrijkste gegevens van het CodeIgniter-framework:
CodeIgniter | |
---|---|
Ontwikkeld door | British Columbia Institute of Technology (BCIT) |
Actuele release | Versie 3.1.2 |
Architectuursjabloon | MVC/HMVC, Active Record, Chain of Responsibility |
Benodigde kennis | PHP, objectgeoriënteerde programmering (OOP) |
Programmeertaal | PHP 5.6 of hoger |
Licentie | MIT-licentie |
Ondersteunde databases | MySQL (5.1+), Oracle, PostgreSQL, MS SQL, SQLite, CUBRID, Interbase/Firebird, ODBC |
ORM | Alleen via externe aanbieders |
Caching | ja |
Template engine | nee |
Namespaces | nee |
PHP auto loading | nee |
Zoekmachinevriendelijke URL's | nee |
Veiligheidsfeatures | Cross-Site-Request-Forgery (XSRF), Cross-Site-Scripting (XSS), SQL-Injection |
Testing library | PHP Unit |
Met zijn compacte ontwerp en gebruiksvriendelijke syntaxis is CodeIgniter bijzonder geschikt voor beginnende programmeurs. Ook voor wie al ervaring heeft met dynamische webontwikkeling op basis van PHP is CodeIgniter handig, omdat je dan dit PHP-gebaseerde lichtgewicht-framework zeer snel onder de knie hebt. Voor meer ervaren webontwikkelaars biedt het een snelle, flexibele oplossing, omdat het een PHP-framework is dat alle basisfunctionaliteit biedt.
Wil je CodeIgniter gebruiken? Dan zal je het MVC-architectuurpatroon moeten accepteren en kunnen werken zonder een sjabloonengine en native ORM. Ondanks de minimale codegrootte is CodeIgniter uitstekend bruikbaar voor kleine en grote webprojecten.