2010-10-26 2 views
7

Я создал 2 контроллера в приложении Yii: FirstController.php и SecondController.php в пути контроллера по умолчанию.Функция вызова в другом контроллере в 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(); 
    } 
} 

Когда я пытаюсь выполнить exampleFunc() в SecondController, Yii бросить ошибку:

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() аналогично не работают.

Я новичок в OOP и Yii. В чем проблема?

+0

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

ответ

11

Я решил эту проблему. Автозагрузчик не загружает контроллеры.

Это было в config/main.php:

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

Все работы с этим:

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

Идея совместного использования статических функций между контроллерами _in_ контроллер является злом , Вот для чего нужны компоненты. – pestaa

+1

Да, я бы использовал компонент или оба контроллера расширили базовый класс, у которого есть функция, которую вы хотите, чтобы оба они вызывали. Вы даже можете прикрепить эту функцию с помощью Поведения: http://www.yiiframework.com/doc/guide/1.1/en/basics.component#component-behavior – thaddeusmt

+0

можете ли вы рассказать мне, какую версию codeignitor вы используете? –

2

При создании проекта Yii, каждый из контроллеров расширить класс контроллера, и этот класс расширяет встроенный в YII-классе CController.

Это хорошо, потому что контроллер является классом в вашем приложении (его можно найти в папке с компонентами).

Если вы хотите, чтобы какой-либо метод был доступен для обоих ваших контроллеров, поместите этот метод в класс Controller, и поскольку они оба расширяют его. Они оба получат доступ. Просто убедитесь, что объявили его публичным или защищенным.

+0

Да, я думаю, что это или вариант (создание другого класса контроллера с этой функцией и расширение этого) - это путь. Кроме того, поведение может сделать то, что вам нужно, добавив функцию: Да, я бы использовал компонент или оба контроллера расширяли базовый класс, у которого есть функция, которую вы хотите, чтобы оба они вызывали. Вы даже можете прикрепить эту функцию с помощью Поведения: 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

Я получаю следующую ошибку: «Отсутствует аргумент 1 для CController :: __ construct(), вызываемый в ' – shorif2000

Смежные вопросы