Controller Phalcon

Controller Phalcon menyediakan sejumlah metode/perintah/fungsi yang disebut action. Action adalah perintah pada controller yang menangani request. Secara default semua metode public pada kontroler berlaku sbg action dan dapat diakses melalui URL. Action bertanggung jawab untuk menangani request dan membuat respon. Biasanya respon merupakan hasil render dr view, walau ada jg cara lainnya.

Misalnya, ketika Anda mengakses sebuah URL seperti ini:http://localhost/blog/posts/show/2012/the-post-title Phalcon secara default akan terurai setiap bagian seperti ini:

Direktori Phalcon blog
Controller posts
Action show
Parameter 2012
Parameter the-post-title

Dalam hal ini, PostsController akan menangani request ini. Tidak ada lokasi khusus untuk menempatkan controller dalam sebuah aplikasi, mereka dapat diambil menggunakan autoloaders , sehingga Anda bebas untuk mengatur controller Anda yang Anda butuhkan.

Controller harus memiliki akhiran “Controller” sementara action punya akhiran “Action”.Contoh controller adalah sebagai berikut:

<?php

class PostsController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function showAction($year, $postTitle)
    {

    }

}

Parameter URI tambahan didefinisikan sebagai parameter action, sehingga dapat dengan mudah diakses menggunakan variabel lokal. Sebuah controller (opsional) dapat extend dr Phalcon\MVC\Controller. Dengan melakukan ini, controller dapat memiliki akses mudah ke layanan aplikasi.

Parameter tanpa nilai default ditangani sesuai kebutuhan. Nilai pengaturan opsional untuk parameter dilakukan seperti biasa di PHP:

<?php

class PostsController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function showAction($year=2012, $postTitle='some default title')
    {

    }

}

Parameter diberikan dalam urutan yang sama seperti posisinya dalam route. Anda bisa mendapatkan parameter sesuai keinginan dari namanya dengan cara sebagai berikut:

<?php

class PostsController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function showAction()
    {
        $year = $this->dispatcher->getParam('year');
        $postTitle = $this->dispatcher->getParam('postTitle');
    }

}

Dispatch Loop

Dispatch Loop akan dieksekusi dalam Dispatcher sampai tidak ada action yang tersisa untuk dieksekusi. Dalam contoh di atas hanya satu action dieksekusi. Sekarang kita akan melihat bagaimana “forward” dapat memberikan aliran operasi yang lebih kompleks dalam Dispatch Loop , dengan meneruskan eksekusi ke kontroler/action yang berbeda.

<?php

class PostsController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

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

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

}

Jika pengguna tidak memiliki izin untuk mengakses action tertentu kemudian akan diteruskan ke Users controller, action signin.

<?php

class UsersController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function signinAction()
    {

    }

}

Tidak ada batasan pada “forward” dalam aplikasi Anda, asalkan mereka tidak menghasilkan referensi berputar-putar, jika demikian aplikasi Anda akan berhenti. Jika tidak ada action lain yang akan dikirim melalui Dispatch Loop, dispatcher secara otomatis akan memanggil layer view pada MVC yang dikelola oleh Phalcon\MVC\View .

Inisialisasi Controller 

Phalcon\MVC\Controller memiliki metode initialize, yang dieksekusi terlebih dahulu, sebelum tindakan apapun dijalankan pada controller. Penggunaan metode “__construct” tidak dianjurkan.

<?php

class PostsController extends \Phalcon\Mvc\Controller
{

    public $settings;

    public function initialize()
    {
        $this->settings = array(
            "mySetting" => "value"
        );
    }

    public function saveAction()
    {
        if ($this->settings["mySetting"] == "value") {
            //...
        }
    }

}

Metode ‘initialize’ hanya dipanggil jika acara ‘beforeExecuteRoute’ dijalankan dengan sukses. Hal ini menghindarkan logika aplikasi di initializer tidak dapat dijalankan tanpa otorisasi.

Jika Anda ingin menjalankan beberapa logika inisialisasi setelah membangun objek controller Anda dapat menerapkan metode ‘onConstruct’:

<?php

class PostsController extends \Phalcon\Mvc\Controller
{

    public function onConstruct()
    {
        //...
    }
}

Sadarilah bahwa metode ‘onConstruct’ dijalankan bahkan jika action yang akan dilaksanakan tidak ada di controller atau pengguna tidak memiliki akses ke sana (sesuai dengan akses kontrol kustom disediakan oleh pengembang).

Penyuntikan Service

Jika controller extend Phalcon \ MVC \ Pengontrol maka memiliki akses mudah ke wadah layanan dalam aplikasi. Sebagai contoh, jika kita telah mendaftarkan layanan seperti ini:

<?php

$di = new Phalcon\DI();

$di->set('storage', function() {
    return new Storage('/some/directory');
}, true);

Kemudian, kita dapat mengakses dengan layanan dalam beberapa cara:

<?php

class FilesController extends \Phalcon\Mvc\Controller
{

    public function saveAction()
    {

        //Injecting the service by just accessing the property with the same name
        $this->storage->save('/some/file');

        //Accessing the service from the DI
        $this->di->get('storage')->save('/some/file');

        //Another way to access the service using the magic getter
        $this->di->getStorage()->save('/some/file');

        //Another way to access the service using the magic getter
        $this->getDi()->getStorage()->save('/some/file');

        //Using the array-syntax
        $this->di['storage']->save('/some/file');
    }

}

Jika Anda menggunakan Phalcon sebagai kerangka kerja full-stack, Anda dapat membaca layanan yang disediakan secara default dalam framework.

Request dan Respon 

Dengan asumsi bahwa framework menyediakan seperangkat layanan yg telah terdaftar. Kami menjelaskan bagaimana untuk berinteraksi dengan lingkungan HTTP. Service “Request” berisi sebuah instance dari Phalcon\Http\Request dan “response” berisi Phalcon\Http\Response mewakili apa yang akan dikirim kembali ke klien.

<?php

class PostsController extends Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function saveAction()
    {
        // Check if request has made with POST
        if ($this->request->isPost() == true) {
            // Access POST data
            $customerName = $this->request->getPost("name");
            $customerBorn = $this->request->getPost("born");
        }
    }

}

Objek respon biasanya tidak digunakan secara langsung, tapi dibuat sebelum eksekusi action. Kadang-kadang, seperti ketika event afterDispatch, sangat berguna untuk mengakses respon secara langsung:

<?php

class PostsController extends Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function notFoundAction()
    {
        // Send a HTTP 404 response header
        $this->response->setStatusCode(404, "Not Found");
    }

}

Pelajari lebih lanjut tentang HTTP environtment dalam artikel khusus mereka request dan respon .

Session Data 

Session membantu kita menjaga data tetap tersimpan antar request. Anda bisa mengakses Phalcon\Sesi\Bag dari controller untuk merangkum data yang diperlukan terus-menerus.

<?php

class UserController extends Phalcon\Mvc\Controller
{

    public function indexAction()
    {
        $this->persistent->name = "Michael";
    }

    public function welcomeAction()
    {
        echo "Welcome, ", $this->persistent->name;
    }

}

Menggunakan Service Sebagai Controller 

Layanan dapat bertindak sebagai Controller, class Controller selalu diminta dari service container. Oleh karena itu, setiap class lain yang terdaftar dengan nama yg sama dapat dengan mudah menggantikan controller:

<?php

//Register a controller as a service
$di->set('IndexController', function() {
    $component = new Component();
    return $component;
});

        //Register a namespaced controller as a service
        $di->set('Backend\Controllers\IndexController', function() {
            $component = new Component();
            return $component;
        });

Membuat Base Controller 

Beberapa fitur aplikasi seperti access control lists, terjemahan, cache, dan template engine sering digunakan oleh banyak controller. Dalam situasi seperti ini membuat “base controller” sangat disarankan untuk memastikan kode Anda tetap DRY. Sebuah base controller hanyalah sebuah class entend dr Phalcon\MVC\Controller dan merangkum fungsi umum yg harus dimiliki semua controller. Nantinya, semua controller Anda extend dr “base controller” dan memiliki akses ke semua fungsi umum tsb.

Class ini bisa diletakan di mana saja, tapi untuk kaidah organisasi, kami merekomendasikan menyimpannya di folder controller, misalnya apps/controllers/ControllerBase.php. Kita mungkin membutuhkan file ini secara langsung dalam file bootstrap atau menyiapkannya agar mudah dimuat menggunakan autoloader:

<?php

require "../app/controllers/ControllerBase.php";

Penerapan komponen umum (action, metode, properti dll) yg ada dalam file ini:

<?php

class ControllerBase extends \Phalcon\Mvc\Controller
{

  /**
   * This action is available for multiple controllers
   */
  public function someAction()
  {

  }

}

Controller lain sekarang mewarisi semua dari ControllerBase, secara otomatis mendapatkan akses ke komponen umum (dibahas di atas):

<?php

class UsersController extends ControllerBase
{

}

Event di Controller 

Controller otomatis bertindak sebagai pendengar/listener untuk event dispatcher, membuat metode sesuai dengan nama-nama event yg ada memungkinkan Anda untuk menerapkan titik kaitan sebelum / setelah action dieksekusi:

<?php

class PostsController extends \Phalcon\Mvc\Controller
{

    public function beforeExecuteRoute($dispatcher)
    {
        // This is executed before every found action
        if ($dispatcher->getActionName() == 'save') {

            $this->flash->error("You don't have permission to save posts");

            $this->dispatcher->forward(array(
                'controller' => 'home',
                'action' => 'index'
            ));

            return false;
        }
    }

    public function afterExecuteRoute($dispatcher)
    {
        // Executed after every found action
    }

}

 

Terjemahan dr Menggunakan Controller Phalcon
http://docs.phalconphp.com/en/latest/reference/controllers.html