2010-10-26 3 views
7

J'ai créé 2 contrôleurs dans mon application Yii: FirstController.php et SecondController.php dans le chemin du contrôleur par défaut.Fonction d'appel dans un autre contrôleur dans 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(); 
    } 
} 

Lorsque je tente d'exécuter exampleFunc() dans SecondController, Yû renvoyait une erreur:

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

Appel FirstController::returnFunc() De même ne fonctionne pas.

Je suis débutant dans le cadre OOP et Yii. Quel est le problème?

+0

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

Répondre

11

J'ai résolu ce problème. L'autochargeur ne charge pas les contrôleurs.

Il était en config/main.php:

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

Tous les travaux avec ceci:

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

L'idée de partager des fonctions statiques sur les contrôleurs _IN_ un contrôleur est mal . C'est à ça que servent les composants. – pestaa

+1

Oui, j'utiliserais un composant ou les deux contrôleurs étendraient une classe de base qui a la fonction que vous voulez appeler tous les deux. Vous pouvez même attacher cette fonction avec un comportement: http://www.yiiframework.com/doc/guide/1.1/en/basics.component#component-behavior – thaddeusmt

+0

pouvez-vous s'il vous plaît dites-moi quelle version de codeignitor vous utilisez? –

2

Lorsque vous créez un projet Yii, chacun de vos contrôleurs étendent la classe contrôleur, et cette classe étend le bâti dans Yii classe CController. Ceci est bien parce que Controller est une classe dans votre application (elle peut être trouvée dans le dossier des composants).

Si vous voulez qu'une méthode soit accessible par vos deux contrôleurs, placez cette méthode dans la classe Controller, et puisqu'elle les étend tous deux. Ils auront tous deux accès. Assurez-vous simplement de le déclarer public ou protégé.

+0

Oui, je pense que cela ou une variation (créer une autre classe de contrôleur avec cette fonction, et l'étendre) est la voie à suivre. En outre, un comportement pourrait faire ce dont vous avez besoin, en attachant la fonction: Oui, j'utiliserais un composant, ou demanderais aux deux contrôleurs d'étendre une classe de base qui a la fonction que vous voulez qu'ils appellent tous les deux. Vous pouvez même attacher cette fonction avec un comportement: http://www.yiiframework.com/doc/guide/1.1/fr/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

Je reçois l'erreur suivante 'Argument manquant 1 pour CController :: __ construct(), appelé dans » – shorif2000

Questions connexes