Давайте создадим оболочку для использования в консоли. Для этого примера, мы создадим оболочку-"отчет", которая выведет некоторые данные модели. Во-первых, создадим report.php в /vendors/shells/.
<?php class ReportShell extends Shell { function
main() {}}
?>
Теперь мы можем запустить эту оболочку, но она ничего не будет делать. Давайте добавим несколько моделей в оболочку, чтобы мы могли созадить некий отчет. Это делается, так же как и в контроллере: добавлением имен моделей в переменную $uses.
<?phpclass 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() – оболочки будут вызывать этот метод для выполнения кода задачи.
<?phpclass 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 | Плагины>>