Učimo vas kako izraditi web stranicu i programirati
 



Phalcon - PHP Framework

Controller

Controller predstavlja vezu između modela i view-a. U Phalconu controller sadrži metode koji se nazivaju Action (akcije). To su public metode kojima se pristupa pomoću URL-a.

Npr. u URL-u http://localhost/phalcon/posts/show/5/15 je
phalcon - direktorij unutar kojeg su smješteni app i public direktoriji
posts - naziv controllera PostsController
show - action, odnosno public metoda
5 - prvi parametar metode tj. akcije
15 - drugi parametar metode tj. akcije

Phalcon folders directories

Konvencija imenovanja

Svakom controlleru treba se dodati sufix Controller, a akciji Action tako da ćemo u gornjem primjeru imati PostsController i showAction. Naziv kontrolera neka počinje velikim, a akcije malim slovom.
Naziv controller fajla ne ovisi o velikim i malim slovima te se može napisati PostsController.php.
Naziv kontrolera ne može započeti brojem npr. 12PostsController.



Controller direktorij

U Phalconu nije obavezno direktorij za kontrolere /controllers/ staviti na točno određeno mjesto, jer to definiramo u bootstrap index.php fajlu sa autoloader-om. Dakle, /controllers/ direktorij može biti na bilo kojem mjestu u directory stablu.

/phalcon/public/index.php
//Register an autoloader
    $loader = new \Phalcon\Loader();
    $loader->registerDirs(array(
        '../app/controllers/',
        '../app/models/'
    ))->register();

Primjer:
/.../a010posts : pokreni primjer
/.../a010posts/zbroji/5/10 : pokreni primjer
/.../a010posts/zbroji/14 : pokreni primjer
/.../a010posts/zbroji : pokreni primjer - javlja grešku jer $x nije definiran

SOURCES: controller



Proslijeđivanje parametara

Parametre preko URL-a možemo slati u Action na dva načina:
Prvi način je klasičan da se definiraju argumenti unutar funkcije:

public function zbrojiAction($x,$y=10)
    {
        $z=$x+$y;
        echo 'Rezultat zbrajanja je: '.$z;
    }

Drugi način je preko dispathera Phalcon\Mvc\Dispatcher

public function zbrojiDispatchAction()
    {
        //from dispatcher
        $x=$this->dispatcher->getParam(0); //prvi parametar u URL-u
        $y=$this->dispatcher->getParam(1); //drugi parametar u URL-u
        
        $z=$x+$y;
        echo 'Rezultat zbrajanja je: '.$z;
    }

Primjer sa $this->dispatcher->getParam(0):

/.../a010posts/zbrojidispatch/5/10 : pokreni primjer

SOURCES: controller



Forward

Pomoću Phalcon\Mvc\Dispatcher može se izvršiti preusmjeravanje iz jedne akcije u drugu.

public function forvardAction()
    {
        $this->flash->error("You don't have permission to access this area");

        // Forward flow to another action
        $this->dispatcher->forward(array(
            "controller" => "a010posts",
            "action" => "zbrojidispatch"
        ));
    }

U ovom primjeru se iz forvardAction() preusmjerava u zbrojiDispatchAction():

/.../a010posts/forvard/5/10 : pokreni primjer

SOURCES: controller



initialize() , onConstruct()

Unutar Phalconovog kontrolera se ne koristi __construct() konstruktor. Umjesto njega, a u tu svrhu koristi se initialize() metoda koja se izvršava prije nego bilo koja druga metoda (akcija) unutar kontrolera.

Primjer initialize():

/.../a020initialize : pokreni primjer

SOURCES: controller

Umjesto initialize() može se koristiti i onConstruct() metoda. Potonja metoda se izvršava nakon instanciranja controller objekta.

Primjer onConstruct():

/.../a021onconstruct : pokreni primjer

SOURCES: controller



Injektiranje servisa

Controller možemo definirati na dva načina:

    1. bez extends \Phalcon\Mvc\Controller
U tom slučaju kontroler nema pristup kontejneru servisa $di.

    class MojController
    {
        //code
    }

    2. sa extends \Phalcon\Mvc\Controller
Može se pristupati registriranim servisima.

    class MojController extends \Phalcon\Mvc\Controller
    {
        //code
    }

Servisi se definiraju u /public/index.php bootstrap fajlu sa npr.

 //Setup a base URI
    $di->set('url', function(){
        $url = new \Phalcon\Mvc\Url();
        $url->setBaseUri('/');
        return $url;
    });

a unutar controllera im se pristupa na jedan od načina:

 //instancirani objekt
 echo $this->url->getBaseUri();
 
 //di objekt
 echo $this->di->get('url')->getBaseUri();
 echo $this->di->getUrl()->getBaseUri();
 echo $this->getDi()->getUrl()->getBaseUri();
 echo $this->di['url']->getBaseUri();

Primjer injektiranja servisa:

/.../a025injecting : pokreni primjer

SOURCES: controller



Request i response

Objekt request služi da se dohvate varijable iz formulara. Pogledati klasu Phalcon\Http\Request.

 //$_POST[]
 $this->request->getPost('name');
 
 //$_GET[]
 $this->request->getQuery('name');
 
 //$_REQUEST[]
 $this->request->get('name');

Objekt response služi za slanje u browser: headera, cookie, HTTP response, redirection. Pogledati klasu Phalcon\Http\Response.

 $this->response->setStatusCode(404, "Not Found");
 $this->response->setHeader("Content-Type", "text/plain");
 $this->response->setContentType('text/plain', 'UTF-8');
 $this->response->redirect("http://en.wikipedia.org", true); //redirection
 $this->response->setContent("<h1>Hello!</h1>");

Većinu response-a možemo vidjeti u Chrome browseru sa 'Inspect Element'

Primjer sa response metodama:

/.../a035response : pokreni primjer (redirect na Yahoo)
/.../a035response/plain : pokreni primjer
/.../a035response/notfound : pokreni primjer (u Chrome-Inspect Element-Network - status code je 404 Not Found)
/.../a035response/kontent : pokreni primjer

SOURCES: controller



Session pomoću 'persistent' objekta

Pomoću objekta persistent mogu se postaviti trajne varijable kojima će se moći pristupati iz različitih kontrollera i akcija. To su tzv. session podaci koji najčešće služe za prijavu u korisnički račun (login).
Objekt persistent je brži način pristupa Phalcon\Session\Bag klasi. Dakle možemo korisiti metode ove klase ili kraće $this-persistent.

Da bi se objekt persistent mogli korisiti obavezno je u bootstrap fajlu registrirati 'session' servis.

/public/index.php - bootstrap file
 //Setup session
    $di->setShared('session', function() {
        $session = new Phalcon\Session\Adapter\Files();
        $session->start();
        return $session;
    });

Primjer postavlja i prikazuje session podatke sa persistent. Unistenje sessiona je sa $this->session->destroy:

/.../a038persistent/postavi : postavi session
/.../a038persistet/pokazi : pokaži session
/.../a038persistet/unisti : uništi session

SOURCES: controller



Session pomoću 'session' objekta

Osim sa $this->persistent session se može postaviti, prikazati i sa metodama Phalcon\Session\Adapter klase

/public/index.php - bootstrap file
    $this->session->set('name','Marko Marković');
    $this->session->get('name');
    $this->session->remove('name'); //briše 'name' session varijablu
    $this->session->destroy(); //briše sve session varijable
    


Base Controller

U cilju da se spriječi ponavljanje PHP code-a potrebno je stvoriti zajednički kontroler čijim metodama, akcijama i svojstvima će moći pristupiti bilo koji drugi kontroler.
Base Controller je najbolje staviti u /controllers/ direktorij te ga imenovati sa ControllerBase.php.

/controllers/ControllerBase.php
class ControllerBase extends \Phalcon\Mvc\Controller
{
  //ova akcija je dostupna svim kontrolerima
  public function someAction()
  {
    //... code
  }
}

Base Controller se može učitati u bootstrap fajl

/public/index.php
 require '../app/controllers/ControllerBase.php';

ili pomoću autoloader-a.

/controllers/ControllerBase.php
public function initialize()
    {
        //loading ControllerBase class
        $loader = new \Phalcon\Loader();
        $loader->registerClasses(
            array(
                "ControllerBase" => "ControllerBase.php"
            )
        );
        $loader->register();
    }

Primjer učitavanja Base Controllera pomoću autoloader-a:

/.../a040basectrl : pokreni primjer

SOURCES: controller
SOURCES: base controller

Prijedlog:
Bazne kontrolere možemo stavljati u /controllers/base/ direktorij. Možemo imati više različitih baznih kontrolera te ih prema potrebi uključivati pomoću \Phalcon\Loader.



Metode i Akcije

Akcije su metode unutra kontrolera koje se pozivaju URL-om. Akcije moraju imati sufix Action.
Osim akcija unutar kontrolera mogu postojati i obične metode (private, public, protected) koje ne trebaju imati sufix Action.

Primjer kontrolera sa običnom metodom:

/.../a045metode : pokreni primjer

SOURCES: controller



Poddirektorij

Unutar /controllers/ direktorija možemo kreirati poddirektorij npr. /controllers/admin/. Kako bi kontroleri radili pozivom na URL http://.../admin/kontroler/akcija/parametar potrebno je definirati slijedeće:
1. U bootstrap fajlu definirati route sa

/public/index.php - bootstrap fajl
//Setup Router
    $di->set('router', function(){
        require '../app/config/routes.php';
        return $router;
    });
/app/config/routes.php - config fajl
$router = new Phalcon\Mvc\Router();
$router->add('/admin/:controller/:action/:params', array(
    'namespace' => 'Admin',
    'controller' => 1,
    'action' => 2,
    'params' => 3
));

Važno je napomenuti da se redoslijed URL varijabli definira brojevima 1,2,3, a varijable se mogu označavati sa : ili (). Slično kao kod .htaccess i RewriteCond.
Također je bitno unutar kontroler fajla definirati namespace Admin;.

Primjer kontrolera sa običnom metodom:

/.../admin/a048poddir : pokreni primjer - javlja grešku jer nije definiran routes
/.../admin/a048poddir/index : pokreni primjer
/.../admin/a048poddir/ispis : pokreni primjer
/.../admin/a048poddir/zbroji/2/6 : pokreni primjer

SOURCES: controller



Events

U Phalconu su svi kontroleri listeneri za Dispatch evente. To znači da čekaju parametre i dr. iz URL-a.

 $x=$this->dispatcher->getParam(0); //prvi parametar u URL-u



| Uvjeti Korištenja | Zaštita Privatnosti | Kontakt |