2010-10-26 10 views
7

Ho creato 2 controller nella mia applicazione Yii: FirstController.php e SecondController.php nel percorso del controller predefinito.Funzione chiamata in un altro controller in 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(); 
    } 
} 

Quando provo ad eseguire exampleFunc() in SecondController, Yii gettare l'errore:

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() simile non lavorare

Sono newbee in framework OOP e Yii. Qual è il problema?

+0

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

risposta

11

Ho risolto questo problema. Il caricatore automatico non carica i controller.

E 'stato nel config/main.php:

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

Tutti i lavori con questo:

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

L'idea di condividere funzioni statiche attraverso controllori _in_ un controller è il male . Ecco a cosa servono i componenti. – pestaa

+1

Sì, vorrei utilizzare un componente oppure entrambi i controller estendono una classe base che ha la funzione che vuoi che entrambi chiamino. Puoi anche associare questa funzione a un comportamento: http://www.yiiframework.com/doc/guide/1.1/en/basics.component#component-behavior – thaddeusmt

+0

puoi dirmi quale versione di code-editor stai utilizzando? –

2

Quando si crea un progetto Yii, ogni controller di estendere la classe Controller, e che classe estende la costruzione nella classe Yii CController.

Ciò è utile perché Controller è una classe all'interno dell'applicazione (può essere trovata nella cartella dei componenti).

Se si desidera che un metodo sia accessibile da entrambi i controller, inserire tale metodo nella classe Controller e poiché entrambi lo estendono. Entrambi avranno accesso. Assicurati di dichiararlo pubblico o protetto.

+0

Sì, penso che questa o una variazione (la creazione di un'altra classe controller con questa funzione e l'estensione di quella) sia la strada da percorrere. Inoltre, un comportamento potrebbe fare ciò di cui hai bisogno, allegando la funzione: Sì, vorrei utilizzare un componente oppure entrambi i controller estendono una classe base che ha la funzione che vuoi che entrambi chiamino. Si potrebbe anche allegare questa funzione con un comportamento: 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

ottengo il seguente errore 'Argomento mancante 1 per CController :: __ construct(), chiamato in' – shorif2000

Problemi correlati