Tutorial Phalcon 1: Belajar Melalui Contoh

Melalui Tutorial Phalcon pertama ini, kami akan mengantarkan Anda dalam proses pembuatan aplikasi dgn form registrasi sederhana dari awal. Kami juga akan menjelaskan aspek dasar perilaku framework. Jika Anda tertarik pada tool untuk membuat/generate kode otomatis untuk Phalcon, Anda dapat melihat developer tools.

Cek instalasi

Diasumsikan Phalcon telah berhasil terinstal. Cek  pada output phpinfo() untuk melihat bagian yg mereferensikan “Phalcon” atau eksekusi kode dibawah:

<?php print_r(get_loaded_extensions()); ?>

Ekstensi Phalcon harusnya telah muncul pada output:

Array
(
    [0] => Core
    [1] => libxml
    [2] => filter
    [3] => SPL
    [4] => standard
    [5] => phalcon
    [6] => pdo_mysql
)

Membuat sebuah project

Cara terbaik untuk memanfaatkan petunjuk ini adalah mengikuti setiap langkahnya secara runtut. Anda dapat mendapatkan kode lengkapnya disini.

Struktur file

Phalcon tidak megharuskan struktur file tertentu pada pengembangan aplikasi. Karena memang dibuat secara fleksible, tanpa keterikatan satu sama lain, Anda dapat mengimplementasikan aplikasi dari Phalcon dgn struktur file yg nyaman menurut Anda.

Untuk tutorial ini dan titik awal, kami menyarankan struktur file/folder berikut:

tutorial/
  app/
    controllers/
    models/
    views/
  public/
    css/
    img/
    js/

Catat bahwa Anda tidak butuh direktory “library” terkait dgn Phalcon. Framework tersimpan di memory, siap untuk digunakan.

URL yg bersahabat

Kami akan menggunakan alamat URL yg bersahabat pada tutorial ini. Url yg bersahabat & mudah dipahami sangat bagus untuk SEO dan juga mudah diingat pengguna. Phalcon mendukung module rewrite yg disediakan oleh berbagai web server populer. Membuat URL aplikasi yg bersahabat bukanlah suatu keharusan dan Anda masih bisa men-develop dgn mudah tanpanya.

Pada contoh ini kami akan menggunakan module rewrite untuk apache. Mari kita buat beberapa rule pada file /tutorial/.htaccess:

#/tutorial/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule  ^$ public/    [L]
    RewriteRule  (.*) public/$1 [L]
</IfModule>

semua request ke project/aplikasi akan di-rewrite ke direktori public/ membuatnya sebagai root dokumen. Langkah ini memastikan bahwa folder internal project/sistem tetap tersembunyi dr pandangan publik dan meng-eliminasi ancaman keamanan pada celah ini.

Sederet rule kedua ini akan memeriksa ada tidaknya file yg diminta, jika file tidak ditemukan maka akan di-rewrite oleh module webserver, diarahkan ke index.php:

#/tutorial/public/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
</IfModule>

Bootstrap

File pertama yg perlu dibuat adalah file bootstrap. File ini sangat penting; karena bertindak sebagai dasar dr aplikasi, memberi Anda kendali thd semua aspeknya. Dalam file ini Anda dapat mengimplementasikan inisialisasi komponen dan juga perilaku aplikasi (behavior).

File tutorial/public/index.php berbentuk sbb:

<?php

try {

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

    //Create a DI
    $di = new Phalcon\DI\FactoryDefault();

    //Setup the view component
    $di->set('view', function(){
        $view = new \Phalcon\Mvc\View();
        $view->setViewsDir('../app/views/');
        return $view;
    });

    //Setup a base URI so that all generated URIs include the "tutorial" folder
    $di->set('url', function(){
        $url = new \Phalcon\Mvc\Url();
        $url->setBaseUri('/tutorial/');
        return $url;
    });

    //Handle the request
    $application = new \Phalcon\Mvc\Application($di);

    echo $application->handle()->getContent();

} catch(\Phalcon\Exception $e) {
     echo "PhalconException: ", $e->getMessage();
}

Autoloader

Bagian pertama yg ada di bootstrap adalah meregistrasikan autoloader. Ini akan digunakan untuk me-load class sebagai controller dan model dalam aplikasi. Contohnya meregistrasikan beberapa direktori dari controller meningkatkan flesibilitas aplikasi. Pada contoh kami menggunakan komponen Phalcon/loader.

Dengannya, kita dapat me-load class berdasarkan direktori yg telah didefinisikan:

<?php

$loader = new \Phalcon\Loader();
$loader->registerDirs(
    array(
        '../app/controllers/',
        '../app/models/'
    )
)->register();

Dependency Management

Konsep utama yg perlu dipahami ketika bekerja dgn Phalcon adalah dependency injection container. Kedengaran rumit tapi sebenarnya simpel & praktis.

Sebuah service container adalah kantong dimana kita secara global menyimpan service membuat aplikasi kita berfungsi. Tiap kali framework membutuhkan sebuah komponen, akan meminta container tsb menggunakan nama service yg telah ditentukan/disepakati. Karena komponen Phalconbersifat saling lepas (decoupled), Phalcon/DI bertindak sebagai perekat yg memfasilitasi integrasi berbagai komponen yg berbeda untuk bekerja sama secara transparan.

<?php

//Create a DI
$di = new Phalcon\DI\FactoryDefault();

Phalcon\DI\FactoryDefault adalah varian dari Phalcon\DI. Agar lebih mudah, objek ini telah teregistrasikan pada kebanyakan komponen yg ada bersama Phalcon. Jadi kita tidak harus mendaftarkan mereka satu per satu. Nantinya tidak akan ada masalah dalam menggantikan layanan pabrik.

Di bagian selanjutnya, kita meregistrasikan service “view” mengindikasikan direktori dimana framework akan mencari file view.  Karena view tidak berkorespodensi dgn class, view tidak dapat ditangani oleh autoloader.

Service bisa didaftarkan dalam beberapa cara, tapi untuk tutorial kita akan menggunakan anonymous function:

<?php

//Setup the view component
$di->set('view', function(){
    $view = new \Phalcon\Mvc\View();
    $view->setViewsDir('../app/views/');
    return $view;
});

Selanjutnya kita mendaftar basis URI sehingga semua URI yang dihasilkan oleh Phalcon memasukan folder “tutorial” yg kita setup sebelumnya. Hal ini penting di kemudian hari dalam tutorial ini ketika kita menggunakan class Phalcon\Tag untuk menghasilkan hyperlink.

<?php

//Setup a base URI so that all generated URIs include the "tutorial" folder
$di->set('url', function(){
    $url = new \Phalcon\Mvc\Url();
    $url->setBaseUri('/tutorial/');
    return $url;
});

Pada bagian terakhir dari file ini, kita menemukan Phalcon\Mvc\Application. Tujuannya adalah untuk menginisialisasi lingkungan request, rute request yang masuk, dan kemudian mengirimkan action yg ditemukan; setiap respon dikumpulkan dan mengembalikanya (return) ketika proses selesai.

<?php

$application = new \Phalcon\Mvc\Application($di);

echo $application->handle()->getContent();

Seperti yang Anda lihat, file bootstrap sangat singkat dan kita tidak perlu menyertakan file-file tambahan. Kita telah membuat sendiri aplikasi MVC fleksibel dalam waktu kurang dari 30 baris kode.

Membuat Controller

Secara default Phalcon akan mencari controller bernama “Index”. Ini adalah titik awal ketika tidak ada controller atau tindakan yang diminta dalam request. Indeks controller (app/controllers/IndexController.php) terlihat seperti:

<?php

class IndexController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {
        echo "<h1>Hello!</h1>";
    }

}

Class controller harus memiliki akhiran “Controller” dan action pada controller harus memiliki akhiran “Action”. Jika Anda mengakses aplikasi dari browser Anda, Anda akan melihat sesuatu seperti ini:

../_images/tutorial-1.png

Selamat, Anda telah terbang bersama Phalcon! 😀

Sending output to a view

Mengirimkan output ke layar dari controller adalah pada saat yang diperlukan saja walau sebenarnya tidak diinginkan karena akan dipertanyakan dalam komunitas purist MVC. Semuanya harus diserahkan ke view yang bertanggung jawab untuk output data pada layar. Phalcon akan mencari view dengan nama yang sama dengan action yg dieksekusi terakhir dalam sebuah direktori bernama sama dengan controller yg dieksekusi terakhir (red: nama controller=nama folder & nama action=file view). Dalam hal ini(app/views/index/index.phtml):

<?php echo "<h1>Hello!</h1>";

Action pada Controller (app/controllers/IndexController.php) masih kosong:

<?php

class IndexController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

}

Output browser akan terus sama. Komponen static Phalcon\Mvc\View akan otomatis dibuat ketika eksekusi action selesai. Lebih lanjut tentang penggunaan view dapat dipelajari disini.

Mendesain form pendaftaran/sign-up

Sekarang kita akan mengubah tampilan file index.phtml, untuk menambahkan link ke controller baru bernama “signup”. Tujuannya adalah untuk memungkinkan pengguna untuk mendaftar dalam aplikasi kita.

<?php

echo "<h1>Hello!</h1>";

echo Phalcon\Tag::linkTo("signup", "Sign Up Here!");

Kode HTML yang dihasilkan menampilkan tag HTML anchor (“a”) yang terhubung ke controller baru:

<h1>Hello!</h1> <a href="/tutorial/signup">Sign Up Here!</a>

Untuk menghasilkan tag, kita menggunakan class Phalcon\Tag. Ini adalah class utilitas yang memungkinkan kita untuk membangun tag HTML dalam kaidah kenyamanan penggunaan framework. Sebuah artikel yang lebih rinci mengenai generasi HTML dapat ditemukan disini

../_images/tutorial-2.png

Berikut controller Signup (app/controllers/SignupController.php):

<?php

class SignupController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

}

Action index yg kosong akan membuat eksekusi langsung meluncur ke view (app/views/signup/index.phtml):

<?php use Phalcon\Tag; ?>

<h2>Sign up using this form</h2>

<?php echo Tag::form("signup/register"); ?>

 <p>
    <label for="name">Name</label>
    <?php echo Tag::textField("name") ?>
 </p>

 <p>
    <label for="email">E-Mail</label>
    <?php echo Tag::textField("email") ?>
 </p>

 <p>
    <?php echo Tag::submitButton("Register") ?>
 </p>

</form>

Tampilan akhir di broser menjadi:

../_images/tutorial-3.png

Phalcon\Tag juga menyediakan berbagai perintah untuk membuat elemen form.

Perintah Phalcon\Tag::form hanya menerima satu parameter, misalnya, uri relatif terhadap controller/action dalam aplikasi.

Dengan mengklik tombol “Kirim”, Anda akan melihat sebuah exception muncul dari framework, yang menunjukkan bahwa kita tidak memiliki action “register” dalam controller “signup”. File publik/index.php kami memunculkan exception ini:

PhalconException: Action “register” was not found on controller “signup”

Implementasikan perintah tersebut makan exception akan hilang:

<?php

class SignupController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function registerAction()
    {

    }

}

Jika Anda klik tombol “Kirim” lagi, Anda akan melihat halaman kosong. Nama dan masukan email yang diberikan oleh pengguna harus disimpan dalam database. Menurut pedoman MVC, interaksi database harus dilakukan melalui model sehingga untuk memastikan kode berorientasi obyek bersih.

Membuat Model

Phalcon membawa ORM pertama untuk PHP seluruhnya ditulis dalam bahasa C. Alih-alih meningkatkan kompleksitas pembangunan, bahkan justru menyederhanakan.

Sebelum membuat model pertama, kita perlu membuat tabel database di luar Phalcon untuk digunakan/dipetakan ke model. Sebuah tabel sederhana untuk menyimpan pengguna terdaftar dapat didefinisikan seperti ini:

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(70) NOT NULL,
  `email` varchar(70) NOT NULL,
  PRIMARY KEY (`id`)
);

Model sepantasnya ditempatkan di direktori app/models (app/models/Users.php). Model berikut dipetakan ke tabel “users”:

<?php

class Users extends \Phalcon\Mvc\Model
{

}

Seting koneksi Database

Untuk dapat menggunakan koneksi database dan kemudian mengakses data melalui model kita, kita perlu menentukan dalam proses bootstrap kami. Koneksi database merupakan service yang ada pada aplikasi kita yang dapat digunakan untuk berbagai komponen:

<?php

try {

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

    //Create a DI
    $di = new Phalcon\DI\FactoryDefault();

    //Setup the database service
    $di->set('db', function(){
        return new \Phalcon\Db\Adapter\Pdo\Mysql(array(
            "host" => "localhost",
            "username" => "root",
            "password" => "secret",
            "dbname" => "test_db"
        ));
    });

    //Setup the view component
    $di->set('view', function(){
        $view = new \Phalcon\Mvc\View();
        $view->setViewsDir('../app/views/');
        return $view;
    });

    //Setup a base URI so that all generated URIs include the "tutorial" folder
    $di->set('url', function(){
        $url = new \Phalcon\Mvc\Url();
        $url->setBaseUri('/tutorial/');
        return $url;
    });

    //Handle the request
    $application = new \Phalcon\Mvc\Application($di);

    echo $application->handle()->getContent();

} catch(Exception $e) {
     echo "PhalconException: ", $e->getMessage();
}

Dengan parameter database yg tepat, model akan siap bekerja dan berinteraksi dengan bagian aplikasi lainnya.

Menyimpan data menggunakan model

Menerima data dari form dan menyimpannya ke tabel adalah langkah selanjutnya.

<?php

class SignupController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function registerAction()
    {

        $user = new Users();

        //Store and check for errors
        $success = $user->save($this->request->getPost(), array('name', 'email'));

        if ($success) {
            echo "Thanks for registering!";
        } else {
            echo "Sorry, the following problems were generated: ";
            foreach ($user->getMessages() as $message) {
                echo $message->getMessage(), "<br/>";
            }
        }

        $this->view->disable();
    }

}

Kemudian kita instantiate class Users, yang mengacu sbg record pada tabel Users. Property public pada class tsb memetakan/mewakili setiap kolomnya. Menetapkan nilai-nilai yang relevan dalam record baru dan memanggil perintah save() akan menyimpan data dalam database untuk record tsb. Perintah save() mengembalikan nilai boolean yang menunjukkan apakah penyimpanan data berhasil atau tidak.

ORM otomatis melakukan escape untuk mencegah suntikan SQL injection jadi kita hanya perlu memberikan permintaan ke perintah save().

Validasi tambahan terjadi secara otomatis pada kolom yang didefinisikan sebagai tidak null (wajib diisi). Jika kita tidak memasukkan input pada field yang dibutuhkan saat mendaftar, layar akan menampilkan output seperti ini:

../_images/tutorial-4.png

Kesimpulan

Ini adalah tutorial yang sangat sederhana dan seperti yang Anda lihat, sangat mudah untuk mulai membangun aplikasi yang menggunakan Phalcon. Fakta bahwa Phalcon merupakan extension pada server web Anda tidak mengganggu dengan kemudahan pengembangan atau fitur yang tersedia. Kami mengundang Anda untuk terus membaca manual sehingga Anda dapat menemukan fitur-fitur tambahan yang ditawarkan oleh Phalcon!

Contoh Aplikasi

Aplikasi yg ditenagai oleh Phalcon berikut juga tersedia, memberikan contoh penerapan yg lebih lengkap:

 

Terjemahan dari Tutorial 1: Belajar Phalcon Melalui Contoh
http://docs.phalconphp.com/en/latest/reference/tutorial.html