Как кодировать компоненты CakePHP при использовании в Задачах? - PullRequest
2 голосов
/ 21 июля 2011

У меня есть некоторый код компонента, который я хотел бы использовать в Задаче CakePHP, но я не уверен, что правильно загружаю Контроллер.

Как упрощенная версия, у меня естьдва компонента, которые работают нормально при доступе через расширенный AppController.Один компонент включает в себя другой, потому что он вызывает другой.

Первый компонент:

class BigBrotherComponent extends Object {

    var $Controller = null;

    var $components = array('Sibling');

    function startup(&$controller) {
        $this->Controller =& $controller;
    }

    function doThis() {
       $this->Controller->loadModel('SampleModel');
       $this->Sibling->doThat();
    }
 }

Второй компонент:

class SiblingComponent extends Object {

    var $Controller = null;

    function startup(&$controller) {
        $this->Controller =& $controller;
    }

    function doThat() {
        /* Doing stuff */
    }
 }

Чтобы заставить меня работать с этимВ командной строке я определяю Shell и Task.Это Задача, хотя я не уверен, что я делаю это правильно.

App::import('Core', 'Controller');
App::import('Component', 'Session');
App::import('Component', 'BigBrother');

class BigBrotherTask extends Shell {
    var $Controller; 
    var $BigBrother;

    function initialize() {
        $this->Controller =& new Controller();

        // add session to controller, because some components access $this->Controller->Session->setFlash();
        $this->Controller->Session =& new SessionComponent();
        $this->Controller->Session->startup($this->Controller);

        // Initialise the component
        $this->WordToText =& new WordToTextComponent();
        $this->WordToText->startup($this->Controller);
    }

    function doThat() {
        $this->BigBrother->doThat();
    }

}

Этот тип задачи хорошо работает, когда компонент BigBrother не включает ни одного из своих собственных компонентов, или ссылается на какой-либодругие компоненты отключены от контроллера в компоненте BigBrother.Как вы видите, мне пришлось сделать небольшую хакерскую вещь для компонента Session.

Есть ли лучший способ инициализации и использования компонентов из задач, который будет правильно инициализировать компоненты и подкомпоненты?

1 Ответ

2 голосов
/ 21 июля 2011

Я верю, что придумала лучший способ, но все еще не уверена, что это лучший способ.

Во-первых, компоненты должны установить контроллер с помощью метода initialize (). Это гарантирует, что контроллер назначен, если компонент загружен через контроллер или другой компонент. startup () не запускается для компонентов, загруженных другими компонентами.

Следовательно, компоненты должны иметь следующее

function initialize(&controller, $settings = null) {
    $this->Controller =& $controller;
}

Следующий шаг, чтобы сделать инициализацию контроллера и компонента более похожей на то, что делает диспетчер.

App::import('Core', 'Controller');

class BigBrotherTask extends Shell {
    var $Controller; 

    function initialize() {
        $this->Controller =& new Controller();
        $this->Controller->components = array('Session', 'WordToText');
        $this->Controller->uses = null;

        $this->Controller->constructClasses();
        $this->Controller->startupProcess();
    }

    function doThat() {
        $this->Controller->BigBrother->doThat();
    }

}

Похоже, что у задач нет завершения работы как части их потока, поэтому, если ваши компоненты нуждаются в корректном завершении работы, вам придется кодировать это в конце функции Task или в командной консоли.

...