Home PageКаталог Изменения НовыеКомментарии Пользователи Регистрация
CakePHP: Manual/Developing/Console/CreatingShellsTasks ...
Это старая версия Manual/Developing/Console/CreatingShellsTasks за 2009-03-21 20:03:19..

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

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


Давайте создадим оболочку для использования в консоли. Для этого примера, мы создадим оболочку-"отчет", которая выведет некоторые данные модели. Во-первых, создадим 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 | Плагины>>



 
Комментарии
Добавить комментарий:

Файлов нет. [Показать файлы/форму]