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
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.
//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.
//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
$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.
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
require '../app/controllers/ControllerBase.php';
ili pomoću autoloader-a.
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
//Setup Router
$di->set('router', function(){
require '../app/config/routes.php';
return $router;
});
$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