2010-10-26 117 views
7

He creado 2 controladores en mi aplicación Yii: FirstController.php y SecondController.php en la ruta predeterminada del controlador.Función de llamada en otro controlador en 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(); 
    } 
} 

Cuando intento ejecutar exampleFunc() en SecondController, Yu tirar el error:

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() de manera similar no funciona

Soy newbee en OOP y Yii framework. ¿Cuál es el problema?

+0

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

Respuesta

11

He resuelto este problema. El autocargador no carga los controladores.

Fue en config/main.php:

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

Todo el trabajo con esto:

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

La idea de compartir funciones estáticas a través de los controladores _IN_ un controlador es malo . Para eso están los componentes. – pestaa

+1

Sí, utilizaría un componente o haría que ambos controladores amplíen una clase base que tenga la función que desea que ambos llamen. Incluso podría adjuntar esta función con un Comportamiento: http://www.yiiframework.com/doc/guide/1.1/en/basics.component#component-behavior – thaddeusmt

+0

¿podría decirme qué versión de codeignitor está utilizando? –

2

Cuando se crea un proyecto de Yii, cada uno de los controladores de extender la clase del controlador, y que clase extiende la construyeron en la clase Yii CController.

Esto es bueno porque Controller es una clase dentro de su aplicación (se puede encontrar en la carpeta de componentes).

Si desea que sus dos controladores tengan acceso a un método, ponga ese método en la clase Controlador, y ya que ambos lo amplían. Ambos tendrán acceso. Solo asegúrate de declararlo público o protegido.

+0

Sí, creo que esto o una variación (crear otra clase de controlador con esta función y ampliar esa) es el camino a seguir. Además, un comportamiento puede hacer lo que necesita, al adjuntar la función: Sí, usaría un componente o haría que ambos controladores amplíen una clase base que tenga la función que desea que ambos llamen. Incluso podría adjuntar esta función con un Comportamiento: 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

me aparece el siguiente error 'Falta el argumento 1 para CController :: __construir(), llamado en' – shorif2000

Cuestiones relacionadas