использование компонентов в Cakephp 2+ Shell - PullRequest
5 голосов
/ 04 февраля 2012

Я пытаюсь реализовать задачу, используя оболочку cakephp для моего приложения. Задача включает выполнение длительного процесса (отсюда необходимость использования оболочки).

Функция требует, чтобы я использовал функцию внутри компонента с именем CommonComponent

К сожалению, всякий раз, когда я пытаюсь включить компонент, я получаю следующую ошибку Неустранимая ошибка PHP: класс «Component» не найден в /var/www/nginx-test/app/Controller/Component/CommonComponent.php

Вот класс CronShell, который называется

class CronShell extends AppShell {
   public function main() {
        $this->out('Hello world.');      
//  $this->out(phpinfo());
    }
     public function test()
    {
         $this->out('Before Import'); 
        App::import('Component', 'Common');
        $this->out('Import complete');
        // $this->Common=ClassRegistry::init('CommonComponent');
        $this->Common =new CommonComponent();
        $this->out('Initialization complete');
        $this->Common->testCron();
         $this->out('FunctionCall complete');
        //$this->Common->saveCacheEntry("name","value");
    }
    }

Класс CommonComponent хранится как app / Controller / Component / CommonComponent.php и имеет следующий вид

 class CommonComponent extends Component
{
 function testCron()
    {    
     $this->out('Hello world from Component.');
    }
 }

Есть идеи?

Ответы [ 4 ]

15 голосов
/ 23 июня 2012

Мне пришлось сделать это недавно с компонентом MTurk, который я написал.Мое окончательное решение было использовать библиотеку вместо компонента.Затем компонент получил доступ к библиотеке, чтобы я мог использовать методы как из компонента, так и из оболочки.

Однако, вот код, который позволит вам загрузить компонент из оболочки.*

0 голосов
/ 18 ноября 2014

Я считаю, что семантически неправильно разделять функциональность между контроллерами и оболочками.

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

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

0 голосов
/ 05 февраля 2012

Вы пробовали App::uses('Component', 'Controller'); вверху вашего файла, ev. перед импортом CommonComponent? Тогда я думаю, вам нужно сделать то, что говорит Сэм, или вы можете использовать $this->Controller->Components->load('CommonComponent'), но для этого вам нужно создать класс Controller.

0 голосов
/ 05 февраля 2012

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

, компонент также может использовать код Lib - но вам не придется делать утомительную работу, если вы установитевсе правильно, вы сделаете ваше приложение чище

, если вы импортируете компонент, вам нужно будет передать ему коллекцию компонентов, и вам придется делать это из оболочки оболочки, а не использовать ее (илиесли вы делаете, вы должны делать это неправильно)

...