2010-10-26 30 views
7

Tôi đã tạo 2 bộ điều khiển trong ứng dụng Yii: FirstController.php và SecondController.php trong đường dẫn bộ điều khiển mặc định.Chức năng gọi trong bộ điều khiển khác trong Yii

FirstController.php:

<?php 
class FirstController extends Controller { 
    public static function returnFunc() { return 'OK'; } 
} 

SecondController.php:

<?php 
class SecondController extends Controller { 
    public function exampleFunc() { 
    $var = First::returnFunc(); 
    } 
} 

Khi tôi cố gắng thực hiện exampleFunc() trong SecondController, Yii ném lỗi:

YiiBase::include(FirstController.php) [<a href='function.YiiBase-include'>function.YiiBase-include</a>]: failed to open stream: No such file or directory 

Calling FirstController::returnFunc() tương tự không làm việc.

Tôi là người mới làm quen trong khuôn khổ OOP và Yii. Có chuyện gì vậy?

+0

http://www.yiiframework.com/forum/index.php/topic/6471-call-another-controllers-action/#entry200141 –

Trả lời

11

Tôi đã giải quyết được sự cố này. Trình tải tự động không tải bộ điều khiển.

Đó là vào năm config/main.php:

'import' => array(
    'application.models.*', 
    'application.components.*', 
), 

Tất cả công việc với điều này:

'import' => array(
    'application.models.*', 
    'application.components.*', 
    'application.controllers.*', 
), 
+8

Ý tưởng về chia sẻ chức năng tĩnh trên bộ điều khiển _in_ một bộ điều khiển là ác . Đó là những gì các thành phần được cho. – pestaa

+1

Có, tôi sẽ sử dụng một thành phần, hoặc có cả hai bộ điều khiển mở rộng một lớp cơ sở có chức năng mà bạn muốn cả hai người trong số họ gọi. Bạn thậm chí có thể đính kèm chức năng này với Hành vi: http://www.yiiframework.com/doc/guide/1.1/en/basics.component#component-behavior – thaddeusmt

+0

bạn có thể vui lòng cho tôi biết phiên bản của người viết mã bạn đang sử dụng không? –

2

Khi bạn tạo một dự án Yii, mỗi người trong số các bộ điều khiển của bạn mở rộng các lớp Controller, và lớp học mà mở rộng xây dựng trong CCii lớp Yii.

Điều này rất tốt vì Bộ điều khiển là một lớp trong ứng dụng của bạn (nó có thể được tìm thấy trong thư mục thành phần).

Nếu bạn muốn một phương thức có thể truy cập được bởi cả hai bộ điều khiển của bạn, hãy đặt phương thức đó trong lớp Bộ điều khiển và vì cả hai đều mở rộng nó. Cả hai đều có quyền truy cập. Chỉ cần đảm bảo tuyên bố công khai hoặc được bảo vệ.

+0

Có, tôi nghĩ rằng điều này hoặc một biến thể (tạo ra một lớp điều khiển với chức năng này, và mở rộng một trong đó) là con đường để đi. Ngoài ra, một hành vi có thể làm những gì bạn cần, bằng cách gắn hàm: Có, tôi sẽ sử dụng một thành phần, hoặc có cả hai bộ điều khiển mở rộng một lớp cơ sở có hàm mà bạn muốn cả hai hàm gọi. Bạn thậm chí có thể đính kèm chức năng này với một hành vi: http://www.yiiframework.com/doc/guide/1.1/en/basics.component#component-behavior – thaddeusmt

4
class ServiceController extends Controller 
{ 
    public function actionIndex() 
    { 
     Yii::import('application.controllers.back.ConsolidateController'); // ConsolidateController is another controller in back controller folder 
     echo ConsolidateController::test(); // test is action in ConsolidateController 



class ServiceController extends Controller 
{ 
    public function actionIndex() 
    { 
    Yii::import('application.controllers.back.CservicesController'); 
    $obj =new CservicesController(); // preparing object 
    echo $obj->test(); exit; // calling method of CservicesController 
+3

tôi nhận được lỗi sau 'Thiếu đối số 1 cho CController :: __ construct(), được gọi là trong' – shorif2000

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