Aplikasi Phalcon (MVC)

Semua kerja keras di balik operasi MVC di Aplikasi Phalcon normalnya dilakukan oleh Phalcon \ MVC \ Application . Komponen ini merangkum semua operasi kompleks yang diperlukan di belakang, membuat instance setiap komponen yang diperlukan dan mengintegrasikannya dengan proyek, untuk memungkinkan pola MVC untuk beroperasi seperti yang diinginkan.

Aplikasi Phalcon Modul tunggal atau multi 

Dengan komponen ini Anda dapat menjalankan berbagai jenis struktur MVC:

Modul tunggal 

Aplikasi single MVC terdiri dari satu modul saja. Namespace dapat digunakan tetapi tidak diperlukan. Sebuah aplikasi seperti ini akan memiliki struktur file berikut:

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

Jika namespace tidak digunakan, file bootstrap berikut dapat digunakan untuk mengatur aliran MVC:

<?php

use Phalcon\Loader,
    Phalcon\DI\FactoryDefault,
    Phalcon\Mvc\Application,
    Phalcon\Mvc\View;

$loader = new Loader();

$loader->registerDirs(
    array(
        '../apps/controllers/',
        '../apps/models/'
    )
)->register();

$di = new FactoryDefault();

// Registering the view component
$di->set('view', function() {
    $view = new View();
    $view->setViewsDir('../apps/views/');
    return $view;
});

try {

    $application = new Application($di);

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

} catch (\Exception $e) {
    echo $e->getMessage();
}

Jika namespace yang digunakan, bootstrap berikut dapat digunakan:

<?php

use Phalcon\Loader,
    Phalcon\Mvc\View,
    Phalcon\DI\FactoryDefault,
    Phalcon\Mvc\Dispatcher,
    Phalcon\Mvc\Application;

$loader = new Loader();

// Use autoloading with namespaces prefixes
$loader->registerNamespaces(
    array(
        'Single\Controllers' => '../apps/controllers/',
        'Single\Models'      => '../apps/models/',
    )
)->register();

$di = new FactoryDefault();

// Register the dispatcher setting a Namespace for controllers
$di->set('dispatcher', function() {
    $dispatcher = new Dispatcher();
    $dispatcher->setDefaultNamespace('Single\Controllers');
    return $dispatcher;
});

// Registering the view component
$di->set('view', function() {
    $view = new View();
    $view->setViewsDir('../apps/views/');
    return $view;
});

try {

    $application = new Application($di);

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

} catch(\Exception $e){
    echo $e->getMessage();
}

Multi-Modul 

Sebuah aplikasi multi-modul menggunakan root dokumen yang sama untuk lebih dari satu modul. Dalam hal ini struktur file berikut dapat digunakan:

multiple/
  apps/
    frontend/
       controllers/
       models/
       views/
       Module.php
    backend/
       controllers/
       models/
       views/
       Module.php
  public/
    css/
    img/
    js/

Setiap direktori pada apps/ memiliki struktur MVC sendiri. Sebuah Module.php hadir untuk mengkonfigurasi pengaturan khusus dari setiap modul seperti autoloaders atau layanan kustom:

<?php

namespace Multiple\Backend;

use Phalcon\Loader,
    Phalcon\Mvc\Dispatcher,
    Phalcon\Mvc\View,
    Phalcon\Mvc\ModuleDefinitionInterface;

class Module implements ModuleDefinitionInterface
{

    /**
     * Register a specific autoloader for the module
     */
    public function registerAutoloaders()
    {

        $loader = new Loader();

        $loader->registerNamespaces(
            array(
                'Multiple\Backend\Controllers' => '../apps/backend/controllers/',
                'Multiple\Backend\Models'      => '../apps/backend/models/',
            )
        );

        $loader->register();
    }

    /**
     * Register specific services for the module
     */
    public function registerServices($di)
    {

        //Registering a dispatcher
        $di->set('dispatcher', function() {
            $dispatcher = new Dispatcher();
            $dispatcher->setDefaultNamespace("Multiple\Backend\Controllers");
            return $dispatcher;
        });

        //Registering the view component
        $di->set('view', function() {
            $view = new View();
            $view->setViewsDir('../apps/backend/views/');
            return $view;
        });
    }

}

Sebuah file bootstrap khusus yang diperlukan untuk memuat arsitektur MVC multi-modul:

<?php

use Phalcon\Mvc\Router,
    Phalcon\Mvc\Application,
    Phalcon\DI\FactoryDefault;

$di = new FactoryDefault();

//Specify routes for modules
$di->set('router', function () {

    $router = new Router();

    $router->setDefaultModule("frontend");

    $router->add("/login", array(
        'module'     => 'backend',
        'controller' => 'login',
        'action'     => 'index',
    ));

    $router->add("/admin/products/:action", array(
        'module'     => 'backend',
        'controller' => 'products',
        'action'     => 1,
    ));

    $router->add("/products/:action", array(
        'controller' => 'products',
        'action'     => 1,
    ));

    return $router;
});

try {

    //Create an application
    $application = new Application($di);

    // Register the installed modules
    $application->registerModules(
        array(
            'frontend' => array(
                'className' => 'Multiple\Frontend\Module',
                'path'      => '../apps/frontend/Module.php',
            ),
            'backend'  => array(
                'className' => 'Multiple\Backend\Module',
                'path'      => '../apps/backend/Module.php',
            )
        )
    );

    //Handle the request
    echo $application->handle()->getContent();

} catch(\Exception $e){
    echo $e->getMessage();
}

Jika Anda ingin mengelola konfigurasi modul dalam file bootstrap Anda dapat menggunakan fungsi anonim untuk mendaftarkan modul:

<?php

//Creating a view component
$view = new \Phalcon\Mvc\View();

//Set options to view component
//...

// Register the installed modules
$application->registerModules(
    array(
        'frontend' => function($di) use ($view) {
            $di->setShared('view', function() use ($view) {
                $view->setViewsDir('../apps/frontend/views/');
                return $view;
            });
        },
        'backend' => function($di) use ($view) {
            $di->setShared('view', function() use ($view) {
                $view->setViewsDir('../apps/backend/views/');
                return $view;
            });
        }
    )
);

Ketika Phalcon \ MVC \ Application telah terisi dgn modul, perhatikan bahwa setiap route harus diarahkan pada modul yg valid. Setiap modul yg terdaftar memiliki  kelas terkait yg menawarkan fungsi untuk mengatur modul itu sendiri. Setiap definisi kelas modul harus menerapkan dua metode: registerAutoloaders() dan registerServices(), metode tsb akan dipanggil oleh Phalcon \ MVC \ Application sesuai dengan modul yang akan dieksekusi.

Memahami perilaku default 

Jika Anda sudah mengikuti tutorial atau telah menghasilkan kode menggunakan Phalcon DevTools , Anda mungkin mengenali file bootstrap berikut:

<?php

try {

    // Register autoloaders
    //...

    // Register services
    //...

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

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

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

Inti dari semua pekerjaan controller terjadi ketika handle() dipanggil:

<?php

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

Bootstrap manual 

Jika Anda tidak ingin menggunakan Phalcon \ MVC \ Application , kode di atas dapat diubah sebagai berikut:

<?php

// Get the 'router' service
$router = $di['router'];

$router->handle();

$view = $di['view'];

$dispatcher = $di['dispatcher'];

// Pass the processed router parameters to the dispatcher
$dispatcher->setControllerName($router->getControllerName());
$dispatcher->setActionName($router->getActionName());
$dispatcher->setParams($router->getParams());

// Start the view
$view->start();

// Dispatch the request
$dispatcher->dispatch();

// Render the related views
$view->render(
    $dispatcher->getControllerName(),
    $dispatcher->getActionName(),
    $dispatcher->getParams()
);

// Finish the view
$view->finish();

$response = $di['response'];

// Pass the output of the view to the response
$response->setContent($view->getContent());

// Send the request headers
$response->sendHeaders();

// Print the response
echo $response->getContent();

Pengganti Phalcon \ MVC \ Application berikut tak memiliki komponen view sehingga cocok untuk Rest-API:

<?php

// Get the 'router' service
$router = $di['router'];

$router->handle();

$dispatcher = $di['dispatcher'];

// Pass the processed router parameters to the dispatcher
$dispatcher->setControllerName($router->getControllerName());
$dispatcher->setActionName($router->getActionName());
$dispatcher->setParams($router->getParams());

// Dispatch the request
$dispatcher->dispatch();

//Get the returned value by the latest executed action
$response = $dispatcher->getReturnedValue();

//Check if the action returned is a 'response' object
if ($response instanceof Phalcon\Http\ResponseInterface) {

    //Send the request
    $response->send();
}

Namun alternatif lain yang menangkap exception yg muncul di dispatcher diteruskan/forward ke action lain:

<?php

// Get the 'router' service
$router = $di['router'];

$router->handle();

$dispatcher = $di['dispatcher'];

// Pass the processed router parameters to the dispatcher
$dispatcher->setControllerName($router->getControllerName());
$dispatcher->setActionName($router->getActionName());
$dispatcher->setParams($router->getParams());

try {

    // Dispatch the request
    $dispatcher->dispatch();

} catch (Exception $e) {

    //An exception has occurred, dispatch some controller/action aimed for that

    // Pass the processed router parameters to the dispatcher
    $dispatcher->setControllerName('errors');
    $dispatcher->setActionName('action503');

    // Dispatch the request
    $dispatcher->dispatch();

}

//Get the returned value by the latest executed action
$response = $dispatcher->getReturnedValue();

//Check if the action returned is a 'response' object
if ($response instanceof Phalcon\Http\ResponseInterface) {

    //Send the request
    $response->send();
}

Meskipun implementasi di atas jauh lebih verbose dari kode yang diperlukan saat menggunakan Phalcon \ MVC \ Application , kode tsb menawarkan sebuah alternatif dalam bootstrap aplikasi Anda. Tergantung pada kebutuhan Anda, Anda mungkin ingin memiliki kontrol penuh dari apa yang harus dipakai atau tidak, atau mengganti komponen tertentu dengan komponen dari Anda sendiri untuk memperluas fungsionalitas default.

Event Aplikasi 

Phalcon \ MVC \ Application mampu mengirim event ke EventsManager (jika ada).  Event yang dipicu menggunakan jenis “application”. Event berikut ini didukung:

Nama Acara Dipicu
boot Dijalankan ketika aplikasi menangani permintaan pertama
beforeStartModule Sebelum menginisialisasi modul, hanya ketika modul terdaftar
afterStartModule Setelah menginisialisasi modul, hanya ketika modul terdaftar
beforeHandleRequest Sebelum mengeksekusi loop dispatch
afterHandleRequest Setelah mengeksekusi loop dispatch

Contoh berikut menunjukkan bagaimana untuk melampirkan pendengar untuk komponen ini:

<?php

use Phalcon\Events\Manager as EventsManager;

$eventsManager = new EventsManager();

$application->setEventsManager($eventsManager);

$eventsManager->attach(
    "application",
    function($event, $application) {
        // ...
    }
);

Sumber eksternal 

 

Terjemahan dari Aplikasi MVC Phalcon
http://docs.phalconphp.com/en/latest/reference/applications.html