2012-02-04 28 views
5

Estoy tratando de implementar una tarea usando el shell cakephp para mi aplicación. La tarea implica ejecutar un proceso de larga ejecución (de ahí la necesidad de usar el shell).usando componentes en Cakephp 2+ Shell

La función me obliga a utilizar una función dentro de un componente llamado CommonComponent

Desafortunadamente siempre que intente incluir el componente me sale el siguiente error PHP Fatal error: Class 'Componente' no se encuentra en/var/www /nginx-test/app/Controller/Component/CommonComponent.php

Aquí es la clase CronShell que está siendo llamado

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

la clase CommonComponent se almacena como app/controlador/Compon ent/CommonComponent.php y es el siguiente

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

¿Alguna idea?

+0

¿Está pensando en actualizar la respuesta aceptada? –

Respuesta

0

Lo que importa en la cáscara debe ser un código desde su Aplicaciones Lib

el componente también puede hacer uso del código Lib - pero usted no necesita hacer un montón de cosas tediosas si se establece bien usted hará que su aplicación sea más limpia

si importa el componente, tendrá que pasarle una colección de componentes y, por lo tanto, tendrá que hacer eso desde el shell, no que lo use (o si debe hacerlo mal)

+0

Moviendo el código común del componente a un clas dentro de la carpeta lib que funcionó. Todavía estoy confundido sobre qué código debe ser parte de las bibliotecas y qué código debe ser parte de un componente –

+0

@Zulubaba ¿Tiene algún código para ver ya sea pegado en bin.cakephp.org o pegar bin en otro lugar. Puedo apreciar su confusión pero no puedo mejorar sin ver el código, salvo para decir que la compresión de elementos de Mark Story lo hace.Asset Compress usa shell y helper tanto las clases de origen de Lib (ambas direcciones de configuración extra específicas para el plugin son usadas por ambos) Necesitaría saber más acerca de ti comp común y podría sugerir desde allí – sam

0

Ha intentado App::uses('Component', 'Controller'); en la parte superior de su archivo, ev. antes de la importación de CommonComponent? Entonces supongo que debes hacer lo que dice Sam, o podrías usar el $this->Controller->Components->load('CommonComponent') pero para eso necesitas construir la clase Controller.

15

Tuve que hacer esto recientemente con el componente de MTurk que escribí. Mi solución final fue usar una lib en lugar de un componente. Luego hice que el componente accediera a lib para poder usar los métodos de un componente y del shell.

Sin embargo, aquí hay un código que LE PERMITIRÁ cargar un componente desde un shell.

<?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

Esto funciona, pero yo estaba recibiendo una advertencia sobre $ controlador siendo nulo. Para corregir esta advertencia, agregue 'App :: uses ('Controller', 'Controller')' y modifique '$ controller = new Controller()' – Eldelshell

+0

@Ubersoldat ¿qué versión de Cake está usando? Creo que escribí esto para 2.0 –

+0

lo último en este momento: 2.4 – Eldelshell

0

Creo que es semánticamente incorrecto compartir la funcionalidad entre los controladores y las shells.

Si necesita una funcionalidad común, es más claro y ordenado colocarla en una clase separada, colocar esta clase en la carpeta de proveedores y luego importar el código tanto en el controlador como en el shell.

Además, este enfoque no le impide crear componentes y tareas que utilizan la funcionalidad principal y luego compartir estos componentes y tareas entre sus controladores y shells.