2012-02-04 13 views
5

私のアプリケーションにcakephpシェルを使ってタスクを実装しようとしています。この作業には、長時間実行されるプロセスの実行が含まれます(したがって、シェルを使用する必要があります)。Cakephp 2+ Shellのコンポーネントを使用する

機能は、コンポーネント内の機能を使用するために私を必要と私はコンポーネントを含めるようにしようとするたびに残念ながら、私は次のエラー PHPの致命的なエラーが出る

CommonComponent

呼ば:クラス「コンポーネント」の/ var/WWWには見られませんここ/nginx-test/app/Controller/Component/CommonComponent.php

はCommonComponentクラスはアプリ/コントローラ/ COMPONとして格納さ

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

呼び出されるCronShellクラスでありますent/CommonComponent.phpであり、次のとおりです

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

アイデアをお持ちですか?あなたのアプリLibの内からコードでなければなりませんシェルにインポート何

+0

受け入れられた回答を更新することを検討してください。 –

答えて

0

もLibのコードを利用することができコンポーネントは

- しかし、あなたは、あなたが設定されている場合は退屈なもの の負荷を行う必要がありませんよそれはちょうどあなたがよりきれいにアプリをクリーナーにするでしょう

あなたがそれをコンポーネントコレクションに渡す必要があるので、それをあなたがそれを使用しないようにしなければならない場合、

+0

コンポーネントの共通コードをlibフォルダ内のclasに移動しました.Libの一部になるコードと、コンポーネントの一部であるべきコードを混同しています。 –

+0

@Zulubaba bin.cakephp.orgまたはbinにsomeを貼り付けてください。 Mark Storyのasset compressがこれをしていると言っている以外に、あなたの混乱は理解できますが、コードを見て巧みに理解できません。Asset Compressは、Libのクラスをソースとするシェルとヘルパーの両方を使用します(プラグインに固有の追加設定の指示は両方で使用されます) 私はあなたの一般的な補足についてもっと知る必要があり、そこから提案することができます – sam

0

ファイルの最上部にApp::uses('Component', 'Controller');を試したことがありますか。 CommonComponentをインポートする前に?次に、サムの言うことをする必要があるか、$this->Controller->Components->load('CommonComponent')を使うことができますが、Controllerクラスを構築する必要があります。

15

私が書いたMTurkコンポーネントでこれを最近実行しなければなりませんでした。私の最終的な解決策は、コンポーネントの代わりにlibを使用していた。次に、コンポーネントにlibにアクセスさせて、コンポーネントとシェルの両方のメソッドを使用できるようにしました。

ただし、シェルからコンポーネントを読み込むコードはここにあります。

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

$ controllerがnullであることに関する警告が表示されます。この警告を修正するには 'App :: uses( 'Controller'、 'C​​ontroller')'を追加して '$ controller = new Controller()'を変更してください。 – Eldelshell

+0

@Ubersoldどのケーキのバージョンを使用していますか?私はこれを2.0 –

+0

のために書いたと思います:2.4 – Eldelshell

0

コントローラとシェルの間で機能を共有するのは意味的に間違っていると思います。

一般的な機能が必要な場合は、別のクラスに配置することが明確になり、このクラスをベンダーのフォルダに配置して、コントローラとシェルの両方にコードをインポートします。

さらに、この方法では、コア機能を使用するコンポーネントとタスクを作成してから、コントローラとシェル間でこれらのコンポーネントやタスクを共有することができます。

関連する問題