2012-02-04 27 views
5

Próbuję wykonać zadanie przy użyciu powłoki cakephp dla mojej aplikacji. Zadanie polega na uruchomieniu długiego procesu (stąd potrzeba użycia powłoki).przy użyciu składników w Cakephp 2+ Shell

Funkcja wymaga mnie użyć funkcji wewnątrz komponentu o nazwie CommonComponent

Niestety, gdy próbuję to komponent pojawia się następujący błąd PHP Fatal error: Class „Element” nie został odnaleziony w katalogu/var/www /nginx-test/app/Controller/Component/CommonComponent.php

Oto Klasa CronShell który jest nazywany

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"); 
    } 
    } 

Klasa CommonComponent jest przechowywana jako app/Controller/COMPON ent/CommonComponent.php i jest następujący:

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

Wszelkie pomysły?

+0

Zastanów się nad aktualizacją zaakceptowanej odpowiedzi? –

Odpowiedz

0

Co importować do Shell powinien być kod z poziomu Aplikacji Lib

składnik może również skorzystać z kodu Lib - ale nie będziesz musiał zrobić ładunek nudny rzeczy jeśli ustawiony Zrób porządek aplikacji. Jeśli importujesz komponent, musisz przekazać mu kolekcję komponentów, więc musisz zrobić to z powłoki, a nie używać go (lub musisz zrobić to źle)

+0

Przeniesienie wspólnego kodu z komponentu do folderu wewnątrz folderu lib działało.Jestem nadal zdezorientowany na jakim kodzie powinien znaleźć się część bibliotek i jaki kod powinien być częścią komponentu –

+0

@Zulubaba czy masz jakiś kod do wklejenia do bin.cakephp.org lub wklej bin gdzie indziej. Mogę docenić twoje zamieszanie, ale nie mogę rozwinąć się, nie widząc kodu, poza stwierdzeniem, że kompilacja aktywów Marka Story to robi.Asset Compress używa powłoki i helpera, zarówno klas źródłowych z Lib (dodatkowe adresy konfiguracyjne specyficzne dla wtyczki są używane przez obie) Potrzebowałbym wiedzieć więcej o twoim wspólnym kompu i może sugerować stamtąd – sam

0

Czy próbowałeś App::uses('Component', 'Controller'); w górnej części pliku, ev. przed importem CommonComponent? Wtedy myślę, że musisz zrobić to, co sam mówi, lub możesz użyć $this->Controller->Components->load('CommonComponent'), ale musisz zbudować klasę Controller.

15

Musiałem to zrobić ostatnio z komponentem MTurk, który napisałem. Ostatecznym rozwiązaniem było użycie biblioteki zamiast komponentu. Potem miałem dostęp do biblioteki, więc mogłem użyć metod zarówno z komponentu, jak iz powłoki.

Jednak tutaj jest kod, który pozwoli Ci załadować komponent z powłoki.

<?php 
App::uses('AppShell', 'Console/Command'); 
App::uses('ComponentCollection', 'Controller'); 
App::uses('Controller', 'Controller'); 
App::uses('MTurkComponent', 'Controller/Component'); 

class ProcessCompletedTask extends Shell { 
    public function execute() { 
     $this->out("Processing...\n"); 
     $collection = new ComponentCollection(); 
     $this->MTurk = new MTurkComponent($collection); 
     $controller = new Controller(); 
     $this->MTurk->initialize($controller); 

     $this->MTurk->processHITs(); 
     $this->out("Complete\n"); 
    } 
} 
+0

To działa, ale ja byłem otrzymywanie ostrzeżenia o braku kontrolera $. Aby naprawić to ostrzeżenie, dodaj 'App :: uses ('Controller', 'Controller')' i zmodyfikuj '$ controller = new Controller()' – Eldelshell

+0

@Ubersoldat jakiej wersji Cake używasz? Myślę, że napisałem to dla 2.0 –

+0

najnowsze w tej chwili: 2.4 – Eldelshell

0

Uważam, że semantycznie niewłaściwe jest dzielenie się funkcjami między kontrolerami i powłokami.

Jeśli wymagana jest wspólna funkcjonalność, wyraźniej i lepiej jest umieścić ją w osobnej klasie, umieścić tę klasę w folderze dostawców, a następnie zaimportować kod do kontrolera i powłoki.

Ponadto to podejście nie zapobiega tworzeniu komponentów i zadań, które używają podstawowej funkcjonalności, a następnie udostępnia te komponenty i zadania między kontrolerami i powłokami.

Powiązane problemy