2012-02-04 27 views
5

Tôi đang cố triển khai tác vụ bằng cách sử dụng vỏ bánh bao cho ứng dụng của mình. Nhiệm vụ liên quan đến việc chạy một quá trình chạy dài (do đó cần phải sử dụng trình bao).sử dụng các thành phần trong Cakephp 2+ Shell

Chức năng đòi hỏi tôi phải sử dụng một chức năng bên trong một phần gọi là CommonComponent

Đáng tiếc là bất cứ khi nào tôi cố gắng để bao gồm các thành phần i nhận được lỗi PHP Fatal error sau: Class 'Component' không tìm thấy trong thư mục/var/www /nginx-test/app/Controller/Component/CommonComponent.php

đây là lớp CronShell đang được gọi là

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

lớp CommonComponent được lưu giữ như ứng dụng/Controller/Compon ent/CommonComponent.php và như sau

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

Bất kỳ ý tưởng nào?

+0

Cân nhắc cập nhật câu trả lời được chấp nhận? –

Trả lời

0

gì bạn nhập vào Shell nên mã từ trong Apps Lib của bạn

thành phần cũng có thể tận dụng các mã Lib - nhưng bạn sẽ không cần phải làm một tải thứ tẻ nhạt nếu bạn thiết lập nó lên bên phải bạn sẽ làm cho bạn ứng dụng sạch hơn

nếu bạn nhập thành phần bạn sẽ cần để chuyển nó thành bộ sưu tập thành phần và bạn phải làm từ vỏ witin chứ không phải sử dụng nó (hoặc nếu bạn bạn phải làm điều đó sai)

+0

Di chuyển mã chung từ thành phần sang một thư mục bên trong thư mục lib đã hoạt động. Tôi vẫn còn nhầm lẫn về mã nào nên bcome một phần của libs và mã nào nên là một phần của thành phần –

+0

@Zulubaba bạn có một số mã hay không bin.cakephp.org hoặc dán thùng rác vào nơi khác. Tôi có thể đánh giá cao sự nhầm lẫn của bạn nhưng không thể giải thích bằng cách nhìn thấy mã khác ngoài việc nói rằng việc nén nội dung của Mark Story thực hiện điều này.Asset Compress sử dụng shell và helper cả hai lớp nguồn với Lib (hướng dẫn cấu hình phụ cụ thể cho plugin được sử dụng bởi cả hai) Tôi cần biết thêm về bạn comp thông thường và có thể gợi ý từ đó – sam

0

Bạn đã thử App::uses('Component', 'Controller'); ở đầu tệp của mình, ev. trước khi nhập CommonComponent? Sau đó, tôi đoán bạn cần phải làm những gì sam nói, hoặc bạn có thể sử dụng $this->Controller->Components->load('CommonComponent') nhưng cho rằng bạn cần phải xây dựng lớp điều khiển.

15

Tôi phải làm điều này gần đây với thành phần MTurk mà tôi đã viết. Giải pháp cuối cùng của tôi là sử dụng một lib thay vì một thành phần. Sau đó, tôi đã có các thành phần truy cập lib vì vậy tôi có thể sử dụng các phương pháp từ cả một thành phần và từ vỏ.

Tuy nhiên, đây là mã mà S W cho phép bạn tải thành phần từ trình bao.

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

nhận được một cảnh báo về $ controller là null. Để khắc phục cảnh báo này, thêm 'App :: uses ('Controller', 'Controller')' và sửa '$ controller = new Controller()' – Eldelshell

+0

@Ubersoldat phiên bản nào của Cake bạn đang sử dụng? Tôi nghĩ rằng tôi đã viết này cho 2.0 –

+0

mới nhất tại thời điểm này: 2,4 – Eldelshell

0

Tôi tin rằng đó là sai ngữ nghĩa để chia sẻ chức năng giữa bộ điều khiển và vỏ.

Nếu bạn yêu cầu chức năng chung, nó rõ ràng hơn và đặt gọn hơn vào một lớp riêng biệt, đặt lớp này vào thư mục nhà cung cấp của bạn và sau đó nhập mã vào cả bộ điều khiển và vỏ. Ngoài ra, cách tiếp cận này không ngăn cản bạn tạo ra các thành phần và nhiệm vụ sử dụng chức năng cốt lõi và sau đó chia sẻ các thành phần và nhiệm vụ này giữa bộ điều khiển và trình bao của bạn.

Các vấn đề liên quan