Aplikasi Mikro Phalcon

Dengan Phalcon Anda dapat membuat aplikasi layaknya “Micro-Framework” . Dengan melakukan ini, Anda hanya perlu menulis sedikit kode untuk membuat aplikasi PHP.  Aplikasi Mikro Phalcon cocok untuk mengimplementasikan aplikasi kecil, API dan prototipe dengan cara yang praktis.

<?php

$app = new Phalcon\Mvc\Micro();

$app->get('/say/welcome/{name}', function ($name) {
    echo "<h1>Welcome $name!</h1>";
});

$app->handle();

Membuat Aplikasi Micro Phalcon

Phalcon \ MVC \ Micro adalah kelas bertanggung jawab untuk melaksanakan aplikasi mikro.

<?php

$app = new Phalcon\Mvc\Micro();

Mendefinisikan rute 

Setelah membuat instance objek, Anda akan perlu menambahkan beberapa rute. Phalcon \ MVC \ Router mengelola routing yang secara internal. Rute harus selalu mulai dengan /. Sebuah batasan metode HTTP (opsional) diperlukan ketika mendefinisikan rute, sehingga dapat menginstruksikan router untuk mencocokkan hanya jika permintaan juga sesuai dengan metode HTTP tertentu. Contoh berikut ini menunjukkan bagaimana untuk menentukan rute untuk metode GET:

<?php

$app->get('/say/hello/{name}', function ($name) {
    echo "<h1>Hello! $name</h1>";
});

metode “get”  menunjukkan jika berasosiasi dgn metode HTTP GET. Rute /say/hello/{name} juga memiliki parameter {$name} yang dikirimkan secara langsung ke handler rute (fungsi anonim). Handler dijalankan ketika rute cocok. Sebuah handler bisa berupa item apa saja yg callable di PHP. Contoh berikut ini menunjukkan bagaimana mendefinisikan handler dalam berbagai tipe:

<?php

// With a function
function say_hello($name) {
    echo "<h1>Hello! $name</h1>";
}

$app->get('/say/hello/{name}', "say_hello");

// With a static method
$app->get('/say/hello/{name}', "SomeClass::someSayMethod");

// With a method in an object
$myController = new MyController();
$app->get('/say/hello/{name}', array($myController, "someAction"));

//Anonymous function
$app->get('/say/hello/{name}', function ($name) {
    echo "<h1>Hello! $name</h1>";
});

Phalcon \ MVC \ Micro menyediakan satu set metode untuk menentukan metode HTTP sbg batasan suatu rute :

<?php

//Matches if the HTTP method is GET
$app->get('/api/products', "get_products");

//Matches if the HTTP method is POST
$app->post('/api/products/add', "add_product");

//Matches if the HTTP method is PUT
$app->put('/api/products/update/{id}', "update_product");

//Matches if the HTTP method is DELETE
$app->delete('/api/products/remove/{id}', "delete_product");

//Matches if the HTTP method is OPTIONS
$app->options('/api/products/info/{id}', "info_product");

//Matches if the HTTP method is PATCH
$app->patch('/api/products/update/{id}', "info_product");

//Matches if the HTTP method is GET or POST
$app->map('/repos/store/refs',"action_product")->via(array('GET', 'POST'));

Rute dengan Parameter 

Mendefinisikan parameter dalam rute sangat mudah seperti yang ditunjukkan di atas. Nama parameter harus ditutupi dalam kurung. Parameter format juga tersedia menggunakan ekspresi reguler untuk menjamin konsistensi data. Hal ini ditunjukkan pada contoh di bawah:

<?php

//This route have two parameters and each of them have a format
$app->get('/posts/{year:[0-9]+}/{title:[a-zA-Z\-]+}', function ($year, $title) {
    echo "<h1>Title: $title</h1>";
    echo "<h2>Year: $year</h2>";
});

Memulai Route 

Biasanya, rute dimulai pada aplikasi adalah rute /, dan akan lebih sering diakses oleh metode GET. Skenario ini dikodekan sebagai berikut:

<?php

//This is the start route
$app->get('/', function () {
    echo "<h1>Welcome!</h1>";
});

Rewrite Rule 

Aturan berikut dapat digunakan bersama dengan Apache untuk rewrite URI:

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

Bekerja dengan Response 

Anda bebas untuk memproduksi segala jenis respon dalam handler: langsung membuat output, menggunakan mesin template, termasuk view, json, dsb:

<?php

//Direct output
$app->get('/say/hello', function () {
    echo "<h1>Hello! $name</h1>";
});

//Requiring another file
$app->get('/show/results', function () {
    require 'views/results.php';
});

//Returning a JSON
$app->get('/get/some-json', function () {
    echo json_encode(array("some", "important", "data"));
});

Selain itu, Anda memiliki akses ke layanan “respon” , yg mana Anda dapat memanipulasi respon lebih baik:

<?php

$app->get('/show/data', function () use ($app) {

    //Set the Content-Type header
    $app->response->setContentType('text/plain')->sendHeaders();

    //Print a file
    readfile("data.txt");

});

Atau membuat objek respon dan mengembalikannya dari handler:

<?php

$app->get('/show/data', function () {

    //Create a response
    $response = new Phalcon\Http\Response();

    //Set the Content-Type header
    $response->setContentType('text/plain');

    //Pass the content of a file
    $response->setContent(file_get_contents("data.txt"));

    //Return the response
    return $response;
});

Membuat redirect 

Pengalihan dapat dilakukan untuk meneruskan aliran eksekusi pada rute lain:

<?php

//This route makes a redirection to another route
$app->post('/old/welcome', function () use ($app) {
    $app->response->redirect("new/welcome")->sendHeaders();
});

$app->post('/new/welcome', function () use ($app) {
    echo 'This is the new Welcome';
});

Membangkitkan URL untuk Rute 

Phalcon \ MVC \ Url dapat digunakan untuk menghasilkan URL berdasarkan didefinisikan rute. Anda perlu menyiapkan nama untuk rute; dengan cara ini layanan “url”  dapat menghasilkan URL yang sesuai:

<?php

//Set a route with the name "show-post"
$app->get('/blog/{year}/{title}', function ($year, $title) use ($app) {

    //.. show the post here

})->setName('show-post');

//produce an URL somewhere
$app->get('/', function() use ($app) {

    echo '<a href="', $app->url->get(array(
        'for' => 'show-post',
        'title' => 'php-is-a-great-framework',
        'year' => 2012
    )), '">Show the post</a>';

});

Berinteraksi dengan Dependency Injector 

Dalam aplikasi mikro, sebuah service container Phalcon \ DI \ FactoryDefault dibuat secara implisit; selain itu Anda dapat membuat aplikasi di luar wadah untuk memanipulasi layanannya:

<?php

use Phalcon\DI\FactoryDefault,
    Phalcon\Mvc\Micro,
    Phalcon\Config\Adapter\Ini as IniConfig;

$di = new FactoryDefault();

$di->set('config', function() {
    return new IniConfig("config.ini");
});

$app = new Micro();

$app->setDI($di);

$app->get('/', function () use ($app) {
    //Read a setting from the config
    echo $app->config->app_name;
});

$app->post('/contact', function () use ($app) {
    $app->flash->success('Yes!, the contact was made!');
});

Array-sintaks diperbolehkan untuk dengan mudah mengatur / mendapatkan layanan dalam wadah layanan internal:

<?php

use Phalcon\Mvc\Micro,
    Phalcon\Db\Adapter\Pdo\Mysql as MysqlAdapter;

$app = new Micro();

//Setup the database service
$app['db'] = function() {
    return new MysqlAdapter(array(
        "host" => "localhost",
        "username" => "root",
        "password" => "secret",
        "dbname" => "test_db"
    ));
};

$app->get('/blog', function () use ($app) {
    $news = $app['db']->query('SELECT * FROM news');
    foreach ($news as $new) {
        echo $new->title;
    }
});

Handler Not-Found 

Ketika pengguna mencoba untuk mengakses rute yang tidak didefinisikan, aplikasi mikro akan mencoba untuk menjalankan “Tidak-Ditemukan” handler. Contoh perilaku yang di bawah:

<?php

$app->notFound(function () use ($app) {
    $app->response->setStatusCode(404, "Not Found")->sendHeaders();
    echo 'This is crazy, but this page was not found!';
});

Model Aplikasi Micro 

Model dapat digunakan secara transparan Aplikasi Micro, hanya diperlukan sebuah autoloader untuk memuat model:

<?php

$loader = new \Phalcon\Loader();

$loader->registerDirs(array(
    __DIR__ . '/models/'
))->register();

$app = new \Phalcon\Mvc\Micro();

$app->get('/products/find', function(){

    foreach (Products::find() as $product) {
        echo $product->name, '<br>';
    }

});

$app->handle();

Event Aplikasi Micro 

Phalcon \ MVC \ Micro mampu mengirim peristiwa ke EventsManager (jika ada).  Event yang dipicu menggunakan jenis “mikro”. Peristiwa berikut ini didukung:

Nama Acara Dipicu Bisa menghentikan operasi?
beforeHandleRoute Metode utama baru saja disebut, pada saat ini aplikasi tidak tahu jika ada rute yang cocok Ya
beforeExecuteRoute Sebuah rute telah dicocokkan dan mengandung handler valid, pada saat ini handler belum dieksekusi Ya
afterExecuteRoute Dipicu setelah menjalankan handler Tidak
beforeNotFound Dipicu ketika salah satu rute yang ditetapkan sesuai dengan URI yang diminta Ya
afterHandleRoute Dipicu setelah menyelesaikan seluruh proses secara sukses Ya

Pada contoh berikut, kami akan menjelaskan bagaimana mengontrol keamanan aplikasi yang menggunakan event:

<?php

use Phalcon\Mvc\Micro,
    Phalcon\Events\Manager as EventsManager;

//Create a events manager
$eventManager = new EventsManager();

//Listen all the application events
$eventManager->attach('micro', function($event, $app) {

    if ($event->getType() == 'beforeExecuteRoute') {
        if ($app->session->get('auth') == false) {

            $app->flashSession->error("The user isn't authenticated");
            $app->response->redirect("/")->sendHeaders();

            //Return (false) stop the operation
            return false;
        }
    }

});

$app = new Micro();

//Bind the events manager to the app
$app->setEventsManager($eventManager);

Event Middleware 

Selain event manajer, event dapat ditambahkan dengan menggunakan metode ‘before’, ‘after’ dan ‘finish’:

<?php

$app = new Phalcon\Mvc\Micro();

//Executed before every route is executed
//Return false cancels the route execution
$app->before(function() use ($app) {
    if ($app['session']->get('auth') == false) {
        return false;
    }
    return true;
});

$app->map('/api/robots', function(){
    return array(
        'status' => 'OK'
    );
});

$app->after(function() use ($app) {
    //This is executed after the route was executed
    echo json_encode($app->getReturnedValue());
});

$app->finish(function() use ($app) {
    //This is executed when the request has been served
});

Anda dapat memanggil metode beberapa kali untuk menambahkan event lebih dari tipe yang sama:

<?php

$app->finish(function() use ($app) {
    //First 'finish' middleware
});

$app->finish(function() use ($app) {
    //Second 'finish' middleware
});

Kode untuk middlewares dapat digunakan kembali menggunakan kelas terpisah:

<?php

use Phalcon\Mvc\Micro\MiddlewareInterface;

/**
 * CacheMiddleware
 *
 * Caches pages to reduce processing
 */
class CacheMiddleware implements MiddlewareInterface
{
    public function call($application)
    {

        $cache = $application['cache'];
        $router = $application['router'];

        $key = preg_replace('/^[a-zA-Z0-9]/', '', $router->getRewriteUri());

        //Check if the request is cached
        if ($cache->exists($key)) {
            echo $cache->get($key);
            return false;
        }

        return true;
    }
}

Kemudian tambahkan instance untuk aplikasi:

<?php

$app->before(new CacheMiddleware());

Event middleware berikut tersedia:

Nama Acara Dipicu Bisa menghentikan operasi?
before Sebelum mengeksekusi handler. Hal ini dapat digunakan untuk mengontrol akses ke aplikasi tersebut Ya
after Dieksekusi setelah handler dijalankan. Hal ini dapat digunakan untuk menyiapkan respon Tidak
finish Dieksekusi setelah mengirim respon. Hal ini dapat digunakan untuk melakukan bersih-bersih Tidak

Menggunakan Controller sebagai Handler 

Aplikasi Medium/Menengah menggunakan pendekatan Micro\MVC mungkin perlu mengatur handler di controller. Anda dapat menggunakan Phalcon \ MVC \ Micro \ Collection untuk mengelompokan handler yang dimiliki controller:

<?php

use Phalcon\Mvc\Micro\Collection as MicroCollection;

$posts = new MicroCollection();

//Set the main handler. ie. a controller instance
$posts->setHandler(new PostsController());

//Set a common prefix for all routes
$posts->setPrefix('/posts');

//Use the method 'index' in PostsController
$posts->get('/', 'index');

//Use the method 'show' in PostsController
$posts->get('/show/{slug}', 'show');

$app->mount($posts);

Kontroler ‘PostsController’ mungkin terlihat seperti ini:

<?php

class PostsController extends Phalcon\Mvc\Controller
{

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

    public function show($slug)
    {
        //...
    }
}

Dalam contoh di atas controller langsung dibuat instance, Collection juga memiliki kemampuan untuk lazy-load controllers, pilihan ini memberikan kinerja yang lebih baik me-load  controller hanya jika rute terkait cocok:

<?php

$posts->setHandler('PostsController', true);
$posts->setHandler('Blog\Controllers\PostsController', true);

Mengembalikan Response 

Handler dapat mengembalikan respon raw menggunakan Phalcon \ Http \ Response  atau komponen yang mengimplementasikan antarmuka yang relevan. Ketika respon yang dikembalikan oleh handler secara otomatis dikirim oleh aplikasi.

<?php

use Phalcon\Mvc\Micro,
    Phalcon\Http\Response;

$app = new Micro();

//Return a response
$app->get('/welcome/index', function() {

    $response = new Response();

    $response->setStatusCode(401, "Unauthorized");

    $response->setContent("Access is not authorized");

    return $response;
});

Render View 

Phalcon \ MVC \ View \ Simple dapat digunakan untuk membuat tampilan, contoh berikut menunjukkan bagaimana untuk melakukannya:

<?php

$app = new Phalcon\Mvc\Micro();

$app['view'] = function() {
    $view = new \Phalcon\Mvc\View();
    $view->setViewsDir('app/views/');
    return $view;
};

//Return a rendered view
$app->get('/products/show', function() use ($app) {

    // Render app/views/products/show.phtml passing some variables
    echo $app['view']->render('products/show', array(
        'id' => 100,
        'name' => 'Artichoke'
    ));

});

 

 

Terjemahan dr Aplikasi Mikro Phalcon
http://docs.phalconphp.com/en/latest/reference/micro.html