Kada dođemo do točke gdje se WordPress jednostavno više ne može prilagoditi za naše potrebe, treba nam framework. To može biti CRUD za neku bazu podataka, API ili slično.

Što je framework?

Framework je softver koji rješava probleme ponovnog pisanja koda i sigurnosti. Što znači, da se radi o jednom “abstraktnom sloju” iznad običnog PHP-a. Framework nam pruža set klasa i wrapper funkcija koje olakšavaju/ubrzavaju rad s projektom.

Zašto CodeIgniter?

A zašto ne? Ako Google-amo CodeIgniter dobijemo sponzorirane gluposti koje govore o tome da CodeIgniter nije siguran. Svatko pametan će nakon toga otići na:

https://www.cvedetails.com/vulnerability-list/vendor_id-6918/Codeigniter.html

pa sam provjeriti sigurnosne propuste. Znači, vidimo da je verzija 4.1.9 sigurna.

Naravno, ovo ne znači da ne postoje propusti ali ovome možemo (i trebamo) više vjerovati nego tekstu na Google-u. A i ako ste sumnjičavi, možete sami napisati problematične sigurnosne komponente.

Prije instalacije trebate baciti oko na:

https://www.codeigniter.com/user_guide/

Instalacija

Koristimo Linux (ne koristite Linux?). Otvaramo terminal i unosimo:

composer create-project codeigniter4/appstarter project-root

Zatim pokrenimo develpment server sa:

cd project-root
php spark serve

Server je na:

http://localhost:8080/

Env

Env (enviroment variables) datoteka je gdje držimo lokalne postavke. Ako pogledamo .gitignore vidimo da je .env datoteka ignorirana, što znači da podaci u datoteci neće otići na git. U CI u .env datoteku unosimo pristupne podatke baze podataka i sl.

Kopiramo env u .env:

cp env ./.env
nano .env

Pa promjenimo liniju CI_ENVIRONMENT u development (to će nam prikazati debug bar):

CI_ENVIRONMENT = development

Kontroler

Što je kontroler? Kontroler je kao “remote controller”, “nešto” preko čega upravljamo sa ostalim dijelovima frameworka. Naredbe unosimo preko URL stringa odnosno u obliku url putanja (routes). Što znači da “http://localhost:8080/users” dio “/users” obično ima “poveznicu” sa klasom “UsersController” i sa metodom “index”. Dok na primjer, “http://localhost:8080/users/add” poziva “UsersController::add()” metodu. U kontroleru obično pozivamo klase modela (baza podataka) i vanjskih libsa a vraćamo (return) View HTML template skripte.

Da napravimo kontroler, unosimo naredbu:

php spark make:controller Hello --suffix 

Sada imamo “./app/Controllers/HelloController.php” datoteku a u njoj:

<?php

namespace App\Controllers;

use App\Controllers\BaseController;

class HelloController extends BaseController
{
    public function index()
    {
         return "Hello world!"; //ubaci ovaj dio
    }
}

Route

“/app/Config/routes.php” je datoteka sa putanjama. Ovdje određujemo da će ‘/hello’ putanja pozvati HelloController->index(). Pa ubacivamo:

$routes->get('hello', 'HelloController::index');

I sada, ako odemo na “http://localhost:8080/hello”, dobijemo “Hello world!” u pregledniku.

View

View dio je zadužen za ono što se prikazuje u pregledniku, znači HTML. Varijable iz kontrolera prebacimo ovako:

namespace App\Controllers;

use App\Controllers\BaseController;

class HelloController extends BaseController
{
    public function index()
    {
		$data['helloText'] = 'Hello from controller!';
		return view('hello', $data);         
    }
}

Znači, sve što želimo prebaciti, unosimo u $data array i dodajemo u view() funkciju. Prvi argument je naziv datoteke u “/Views” direktoriju a drugi array sa varijablama koje želimo prebaciti u view datoteku.

Pa ćemo zatim napraviti “app/Views/hello.php” I unutra sadržaj:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Hello</title>
  <meta name="description" content="">
  <meta name="author" content="">
</head>
<body>

 <?php echo $helloText ?>

</body>
</html>

Sada imamo u pregledniku na “http://localhost:8080/hello”:

Middleware

Što je? Kod koji starta prije/poslije kontrolera. U CI middleware je pod nazivom filter. Na primjer, možemo provjeriti sigurnosni token. Ako je token neispravan – zahtjev neće doći do kontrolera.

Napravite datoteku:

app/Filters/AuthFilter.php

Sadržaj datoteke:

<?php

namespace App\Filters;

use CodeIgniter\Filters\FilterInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;

class AuthFilter implements FilterInterface
{
    public function before(RequestInterface $request, $arguments = null)
    {
        if (!isset($request->headers()['Authorization']))
        {
            error_log('NO AUTH TOKEN!');
        }
        else
        {
			//...
		}
		
        return $request;
    }
    
    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
    {
        return $request;
    }
}

Da omogućimo filter, moramo ga dodati u: “app/Config/Filters.php” pod “$aliases”:

    public $aliases = [
		//...
        'myauth'        => AuthFilter::class ,
    ];

Libraries

Ovdje se radi o dodatnim klasama koje možemo dijeliti između kontrolera. Na primjer, session library ili ako želite koristiti PDO umjesto built-in modela možete izraditi ‘app/Libraries/MyModel.php’. I umetnuti:

<?php
namespace App\Libraries;

class Mymodel
{
    public function hello()
    {   
		//...
    }
}

Library dodajemo u kontroler sa:

use App\Libraries\Mymodel; 

Model

Model – označava rad sa klasama baze podataka.

U phpMyAdmin unosimo (ili preko terminala):

DROP DATABASE IF EXISTS ci_app;
CREATE DATABASE ci_app;
DROP USER IF EXISTS 'ci_app'@'localhost';
CREATE USER 'ci_app'@'localhost' IDENTIFIED BY 'ci_app';
GRANT ALL ON ci_app.* TO 'ci_app'@'localhost';
USE ci_app;

CREATE TABLE members (
    id int(11) NOT NULL AUTO_INCREMENT,
    name varchar(120) DEFAULT NULL,
    email varchar(120) DEFAULT NULL,
    mobile varchar(45) DEFAULT NULL,
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

U .env datoteci postavljamo pristupne podatke za bazu podataka:

#--------------------------------------------------------------------
# DATABASE
#--------------------------------------------------------------------

database.default.hostname = localhost
database.default.database = ci_app
database.default.username = ci_app
database.default.password = ci_app
database.default.DBDriver = MySQLi
database.default.DBPrefix =

Datoteku modela pravimo sa:

php spark make:model Members --suffix

Pa otvaramo: “/app/Models/MembersModel.php”.

namespace App\Models;

use CodeIgniter\Model;

class MembersModel extends Model
{
    protected $DBGroup          = 'default';
    protected $table            = 'members';
    protected $primaryKey       = 'id';
    protected $useAutoIncrement = true;
    protected $insertID         = 0;
    protected $returnType       = 'array';
    protected $useSoftDeletes   = false;
    protected $protectFields    = true;
    protected $allowedFields    = ["name", "email", "mobile"]; // <- ubacivamo dozvoljene stupce

    // Dates
    protected $useTimestamps = false;
    protected $dateFormat    = 'datetime';
    protected $createdField  = 'created_at';
    protected $updatedField  = 'updated_at';
    protected $deletedField  = 'deleted_at';

    // Validation
    protected $validationRules      = [];
    protected $validationMessages   = [];
    protected $skipValidation       = false;
    protected $cleanValidationRules = true;

    // Callbacks
    protected $allowCallbacks = true;
    protected $beforeInsert   = [];
    protected $afterInsert    = [];
    protected $beforeUpdate   = [];
    protected $afterUpdate    = [];
    protected $beforeFind     = [];
    protected $afterFind      = [];
    protected $beforeDelete   = [];
    protected $afterDelete    = [];
}

Dodajemo putanju u “/app/Config/routes.php”.

$routes->get('test-db', 'HelloController::testModel');

A u “HelloController.php” kontroler dodajemo:

use App\Models\MembersModel;
//...
public function testModel()
{
	$membersModel = new MembersModel();	
	
	//$membersModel->where('id', 12)->delete();  // delete 	
	//$membersModel->update($id, $data);         // update
	//$user = $membersModel->find($user_id);     // find
	//$users = $membersModel->findAll();         // find all
	
	$membersModel->insert([
		"name" => "Damir Sijakovic",
		"email" => "damir.sijakovic@gmail.com",
		"mobile" => "645654656"
	]);  
	
}

I sada kada odemo na “http://localhost:8080/test-db”, podatci će biti unešeni u bazu podataka.

Eto, dovoljno je za početak. Za više svakako proučite CI dokumentaciju i kategoriju ovdje.

Ostale CI objave:

CodeIgniter – Post zahtjev
CodeIgniter – View predlošci
CodeIgniter – Model
CodeIgniter- Registracija/Prijava