Интеграция CLI PHP с CakePHP - PullRequest
       20

Интеграция CLI PHP с CakePHP

2 голосов
/ 30 сентября 2011

У меня есть хороший функционирующий сайт CakePHP 1.3.11, и мне нужен CLI-скрипт для планового обслуживания, поэтому я пишу его на PHP.Есть ли способ сделать сценарий, дружественный к пирогу?В идеале я мог бы использовать функции Cake и модели баз данных Cake, CLI требует доступа к базе данных, но не намного.В идеале я хотел бы включить свой код CLI в контроллер и источник данных в модель, чтобы я мог вызывать эту функцию, как и любую другую функцию Cake, но только из CLI в качестве запланированной задачи.в основном приносит результаты о работе CakeBake и cron; эта статья звучит очень полезно, но это для старой версии торта и требует модифицированной версии index.php.Я больше не уверен, как изменить файл, чтобы он работал в новой версии cakePHP.

Я нахожусь на Windows, если это имеет значение, но у меня есть полный доступ к серверу.В настоящее время я планирую запланировать простой сценарий в стиле cmd "php run.php".

Ответы [ 2 ]

5 голосов
/ 01 октября 2011

Используя оболочки CakePHP, вы должны иметь доступ ко всем моделям и контроллерам вашего приложения CakePHP.

В качестве примера я настроил простую модель, контроллер и скрипт оболочки:

/ приложение / модели / post.php

<?php
class Post extends AppModel {
    var $useTable = false;
}
?>

/ приложение / контроллеры / posts_controller.php

<?php
class PostsController extends AppController {

var $name = 'Posts';
var $components = array('Security');

    function index() {
        return 'Index action';
    }
}
?>

/ приложение / производители / раковины / post.php

<?php

App::import('Component', 'Email'); // Import EmailComponent to make it available
App::import('Core', 'Controller'); // Import Controller class to base our App's controllers off of
App::import('Controller', 'Posts'); // Import PostsController to make it available
App::import('Sanitize'); // Import Sanitize class to make it available

class PostShell extends Shell {
    var $uses = array('Post'); // Load Post model for access as $this->Post

    function startup() {
        $this->Email = new EmailComponent(); // Create EmailComponent object
        $this->Posts = new PostsController(); // Create PostsController object
        $this->Posts->constructClasses(); // Set up PostsController
        $this->Posts->Security->initialize(&$this->Posts); // Initialize component that's attached to PostsController. This is needed if you want to call PostsController actions that use this component
    }

    function main() {
        $this->out($this->Email->delivery); // Should echo 'mail' on the command line
        $this->out(Sanitize::html('<p>Hello</p>')); // Should echo &lt;p&gt;Hello&lt;/p&gt;  on the command line
        $this->out($this->Posts->index()); // Should echo 'Index action' on the command line
        var_dump(is_object($this->Posts->Security)); // Should echo 'true'
    }
}

?>

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

  1. Компоненты, которые вы загружаете напрямую и которые не загружаются через контроллер
  2. Контроллеры (сначала импортируйте класс Controller, затем импортируйте свой собственный контроллер)
  3. Компоненты, используемые контроллерами (После создания нового контроллера запустите метод constructClasses(), а затем метод initialize() конкретного компонента, как показано выше.
  4. Основные служебные классы, такие как класс Sanitize, показанный выше.
  5. Модели (просто включите в свойство $uses вашей оболочки).

Ваша оболочка может иметь метод запуска, который всегда запускается первым, и метод main, который является основным процессом ваших сценариев оболочки и который запускается после запуска.

Чтобы запустить этот скрипт, вы должны ввести /path/to/cake/core/console/cake post в командной строке (возможно, придется проверить правильный способ сделать это в Windows, информация находится в книге CakePHP (http://book.cakephp.org).

Результат приведенного выше скрипта должен быть:

mail
&lt;p&gt;Hello&lt;/p&gt;
Index action
bool(true)

Это работает для меня, но, возможно, люди, которые более продвинуты в оболочках CakePHP, могли бы предложить больше советов или, возможно, исправить некоторые из вышеперечисленных ... Однако я надеюсь, что этого достаточно, чтобы вы начали.

0 голосов
/ 23 сентября 2014

Начиная с CakePHP 2, сценарии оболочки теперь должны быть сохранены в \ Console \ Command.Есть хорошая документация на http://book.cakephp.org/2.0/en/console-and-shells.html

...