Zend Framework 2 : Forward – Redirect – Render
Forward, Redirect, Render. Adalah 3 hal yang paling penting kita ketahui ketika membuat aplikasi berbasis web. Ketiga hal ini berhubungan erat dengan proses Http Response dalam hal mau diapakan atau dibawa ke mana request yang diterima.
Forward terjadi ketika proses selanjutnya terjadi secara internal, alamat di address bar browser tidak berubah, dan jika dilakukan reload terhadap web browser, maka browser akan melakukan ulang request dari sebelumnya.
Redirect adalah 2 langkah proses, di mana aplikasi memerintahkan browser untuk keluar dari alamat pertama, dan menuju alamat berikutnya, alamat address berubah, dan browser tidak akan melakukan ulang request dari sebelumnya, karena sudah berada di alamat kedua, dan tidak ada hubungannya lagi dengan alamat pertama.
sedang Render adalah proses menampilkan view.
Contoh penggunaan Forward, Redirect,dan Render misalkan pada kasus kita akan menyapa pengunjung web dengan nama. Tetapi sebelum pengunjung disapa, pengunjung harus melakukan input nama terlebih dahulu, seperti berikut :
Pada gambar di atas, alamat di browser tertera /hello sedang /hello seharusnya berisi salam sapa kepada user, tapi karena user belum mengisi nama, maka halaman diforward ke halaman loginpage, yang secara alamat tidak terlihat di browser. Codingnya bisa dilihat di bawah ini :
//hello page public function helloAction() { //do hello page, if not authenticated, forward login page 😉 if ( ! $this->getSessContainer()->hellogreeting){ return $this->forward()->dispatch('Test\Controller\Auth', array('action'=>'loginpage')); } $viewmodel = new ViewModel(); $viewmodel->greeting = $this->getSessContainer()->hellogreeting; $viewmodel->setTemplate('test/auth/hello-success'); //already have session hellogreeting ? so render the view ! return $viewmodel; } //do login page ... public function loginpageAction() { if ( ! $this->getSessContainer()->hellogreeting){ $request = $this->getRequest(); if ($request->isPost()){ $nama = $request->getPost('nama', false); if ($nama){ $this->getSessContainer()->hellogreeting = 'Hello '.$nama; //session filled, redirect to hello page 😉 return $this->redirect()->toRoute('default', array('controller'=>'test-auth', 'action'=>'hello')); } } } return array(); }
Pada saat selesai melakukan pengisian dan submit, maka akan diredirect menuju halaman /hello yang sesungguhnya, dan me-render hello-success.phtml. Setelah sukses, akan tampil seperti berikut :
Coding controller lengkapnya sebagai berikut :
namespace Test\Controller; use Zend\Mvc\Controller\ActionController, Zend\View\Model\ViewModel, Zend\Session\Container as SessionContainer; class AuthController extends ActionController { protected $sesscontainer ; private function getSessContainer() { if (!$this->sesscontainer) { $this->sesscontainer = new SessionContainer('zftutorial'); } return $this->sesscontainer; } //do login page ... public function loginpageAction() { if ( ! $this->getSessContainer()->hellogreeting){ $request = $this->getRequest(); if ($request->isPost()){ $nama = $request->getPost('nama', false); if ($username){ $this->getSessContainer()->hellogreeting = 'Hello '.$nama; //session filled, redirect to hello page 😉 return $this->redirect()->toRoute('default', array('controller'=>'test-auth', 'action'=>'hello')); } } } return array(); } public function logoutAction() { //unset session 😉 $this->getSessContainer()->offsetUnset('hellogreeting'); return $this->redirect()->toRoute('default', array('controller'=>'test-auth', 'action'=>'hello')); } //hello page public function helloAction() { //do hello page, if not authenticated, forward login page 😉 if ( ! $this->getSessContainer()->hellogreeting){ return $this->forward()->dispatch('Test\Controller\Auth', array('action'=>'loginpage')); } $viewmodel = new ViewModel(); $viewmodel->greeting = $this->getSessContainer()->hellogreeting; $viewmodel->setTemplate('test/auth/hello-success'); return $viewmodel; } }
Done !
Referensi :
http://www.javapractices.com/topic/TopicAction.do?Id=181
http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html
http://stackoverflow.com/questions/1647594/zend-framework-what-this-forward-is-doing
http://stackoverflow.com/questions/8990195/how-to-use-zend-session-in-zf2
mksih ilmunya mas, saya lgi belajar zend juga…..
iya, sama2 😉
how i can redirect from Module.php ?
class Module extends T4\Module {
public function onBootstrap(MvcEvent $event) {
$em = $event->getApplication()->getEventManager();
$em->attach(MvcEvent::EVENT_DISPATCH, array($this, ‘check’), 100);
}
public function check(MvcEvent $event) {
$serviceManager = $event->getApplication()->getServiceManager();
$auth = new AuthenticationService();
if (!$auth->hasIdentity()) {
// redirect to /login-form
}
}
for checking authentication, you should using route event first instead of dispatch, like the following :
Translate it in English please
this is very old post, you can use google translate 😛