CakePHP: Manual/Developing/Console/CreatingShellsTasks

Создание оболочек и задач

Создание собственных оболочек

Давайте создадим оболочку для использования в консоли. Для этого примера, мы создадим оболочку-"отчет", которая выведет некоторые данные модели. Во-первых, создадим report.php в /vendors/shells/.

<?php 

class ReportShell extends Shell {

    function main() {}

}

?>

Теперь мы можем запустить эту оболочку, но она ничего не будет делать. Давайте добавим несколько моделей в оболочку, чтобы мы могли созадить некий отчет. Это делается, так же как и в контроллере: добавлением имен моделей в переменную $uses.

<?php

class ReportShell extends Shell {

    var $uses = array('Order');

    function main() {

    }

}

?>

После добавления нашей модели в массив $uses мы можем использовать её в методе main(). В этом примере наша модель Order будет доступна через $this->Order в методе main() нашей новой оболочки.

Здесь простой пример кода, который мы можем использовать в оболочке:

class ReportShell extends Shell {

    var $uses = array('Order');

    function main() {

        //Получить заказы, отгруженные в последнем месяце

        $month_ago = date('Y-m-d H:i:s',    strtotime('-1 month'));

        $orders =    $this->Order->findAll("Order.shipped >= '$month_ago'");

        //Вывести информацию о каждом заказе

        foreach($orders as $order) {

            $this->out('Order date:    ' .    $order['created'] . "\n");

            $this->out('Amount: $' .    number_format($order['amount'], 2) . "\n");

            $this->out('----------------------------------------' .    "\n");

     

            $total += $order['amount'];

        }

        //Вывести итоги для выбранных заказов

        $this->out("Total: $" .    number_format($total, 2) . "\n"); 

    }

}

Если команда cake определена в PATH, то вы можете запустить этот отчет на выполнение таким образом:

$ cake report

где report – имя файла оболочки в /vendor/shells/ без расширения .php. На выходе получится нечто подобное:

Hello user,

   Welcome to    CakePHP v1.2 Console

   ---------------------------------------------------------------

   App : app

   Path:    /path/to/cake/app

   ---------------------------------------------------------------

   Order date:    2007-07-30 10:31:12

   Amount:    $42.78

   ----------------------------------------

   Order date:    2007-07-30 21:16:03

   Amount:    $83.63

   ----------------------------------------

   Order date:    2007-07-29 15:52:42

   Amount:    $423.26

   ----------------------------------------

   Order date:    2007-07-29 01:42:22

   Amount:    $134.52

   ----------------------------------------

   Order date:    2007-07-29 01:40:52

   Amount:    $183.56

   ----------------------------------------

   Total:    $867.75


Задачи

Задачи – это маленькие расширения к оболочкам. Они позволяют оболочкам разделять код, и добавляются в оболочки через специальную переменную класса $tasks. Например, во встроенной оболочке bake, определено множество задач:

<?php 

class BakeShell extends Shell {

   var $tasks = array('Project''DbConfig''Model''View''Controller');

}

?>

Задачи хранятся в /vendors/shells/tasks/ в файлах, названных также, как и классы задач. Т.е., если бы мы создавали новую задачу 'cool'. Class CoolTask (который extends Shell) был бы размещен в /vendors/shells/tasks/cool.php.

Каждая задача должна, как минимум, иметь метод execute() – оболочки будут вызывать этот метод для выполнения кода задачи.

<?php

class SoundTask extends Shell {

   var $uses = array('Model'); // также как в контроллере var $uses

   function execute() {}

}

?>

Вы можете вызывать задачи внутри класса оболочки:

<?php 

class SeaShell extends Shell // размещен в /vendors/shells/sea.php {

   var $tasks = array('Sound'); //размещен в /vendors/shells/tasks/sound.php

   function main() {

       $this->Sound->execute();

   }

}

?>

Метод, названный "sound" в классе SeaShell будет перекрывать доступ к функциональности 

задачи Sound, определенной в массиве $tasks.

Вы также можете вызвать задачи прямо из командной строки:

$ cake sea sound

<< Консоль CakePHP | Плагины>>