Aplikasi Command Line Phalcon

Aplikasi CLI dijalankan dari Command-Promp. Hal ini berguna untuk membuat cron-jobs, script, command-utility dan banyak lagi.

Struktur 

Struktur minimal aplikasi CLI akan terlihat seperti ini:

  • app / config / config.php
  • app / tugas / MainTask.php
  • app / cli.php <- file bootstrap utama

Membuat Bootstrap 

Seperti dalam aplikasi MVC biasa, file bootstrap digunakan untuk menginisiasi aplikasi. Bukannya menggunakan bootstrapper index.php dalam aplikasi web, tapi kita akan menggunakan file cli.php untuk bootstrap aplikasi.

Di bawah ini adalah contoh bootstrap yang digunakan untuk contoh ini.

<?php

 use Phalcon\DI\FactoryDefault\CLI as CliDI,
     Phalcon\CLI\Console as ConsoleApp;

 define('VERSION', '1.0.0');

 //Using the CLI factory default services container
 $di = new CliDI();

 // Define path to application directory
 defined('APPLICATION_PATH')
 || define('APPLICATION_PATH', realpath(dirname(__FILE__)));

 /**
  * Register the autoloader and tell it to register the tasks directory
  */
 $loader = new \Phalcon\Loader();
 $loader->registerDirs(
     array(
         APPLICATION_PATH . '/tasks'
     )
 );
 $loader->register();

 // Load the configuration file (if any)
 if(is_readable(APPLICATION_PATH . '/config/config.php')) {
     $config = include APPLICATION_PATH . '/config/config.php';
     $di->set('config', $config);
 }

 //Create a console application
 $console = new ConsoleApp();
 $console->setDI($di);

 /**
 * Process the console arguments
 */
 $arguments = array();
 foreach($argv as $k => $arg) {
     if($k == 1) {
         $arguments['task'] = $arg;
     } elseif($k == 2) {
         $arguments['action'] = $arg;
     } elseif($k >= 3) {
        $arguments['params'][] = $arg;
     }
 }

 // define global constants for the current task and action
 define('CURRENT_TASK', (isset($argv[1]) ? $argv[1] : null));
 define('CURRENT_ACTION', (isset($argv[2]) ? $argv[2] : null));

 try {
     // handle incoming arguments
     $console->handle($arguments);
 }
 catch (\Phalcon\Exception $e) {
     echo $e->getMessage();
     exit(255);
 }

Kode-kode tersebut dapat dijalankan dengan menggunakan perintah:

$ php app/cli.php

This is the default task and the default action

Task 

Task bekerja mirip dengan kontroler. Setiap aplikasi CLI membutuhkan setidaknya mainTask dan mainAction dan setiap Task harus memiliki mainAction yang akan dijalankan jika tidak ada action yang diberikan secara eksplisit.

Di bawah ini adalah contoh dari file app/task/MainTask.php

<?php

class MainTask extends \Phalcon\CLI\Task
{
    public function mainAction() {
         echo "\nThis is the default task and the default action \n";
    }
}

Pengolahan Parameter Action 

Setiap action dapat diberi parameter untuk diolah. Contoh kodenya sudah ada dalam sampel bootstrap diatas.

Jika Anda menjalankan aplikasi dengan parameter berikut dan action:

<?php

class MainTask extends \Phalcon\CLI\Task
{
    public function mainAction() {
         echo "\nThis is the default task and the default action \n";
    }

    /**
    * @param array $params
    */
   public function testAction(array $params) {
       echo sprintf('hello %s', $params[0]) . PHP_EOL;
       echo sprintf('best regards, %s', $params[1]) . PHP_EOL;
   }
}
$ php app/cli.php main test world universe

hello world
best regards, universe

Menjalankan Task berantai 

Bisa juga untuk menjalankan task-task dalam rantai jika diperlukan. Untuk melakukannya, Anda harus menambahkan console ke DI:

<?php

$di->setShared('console', $console);

...

try {
    // handle incoming arguments
    $console->handle($arguments);
}

Kemudian Anda dapat menggunakan properti console dalam task pada bagian manapun. Di bawah ini adalah contoh dari MainTask.php yg dimodifikasi:

<?php

class MainTask extends \Phalcon\CLI\Task
{
    public function mainAction() {
        echo "\nThis is the default task and the default action \n";

        $this->console->handle(array(
           'task' => 'main',
           'action' => 'test'
        ));
    }

    public function testAction() {
        echo '\nI will get printed too!\n';
    }
}

Namun, akan lebih baik bila extend \Phalcon\CLI\Task untuk menerapkan logika semacam ini.

Terjemahan dr Aplikasi Command Line Phalcon
http://docs.phalconphp.com/en/latest/reference/cli.html