Fonction d'appel dans un autre contrôleur dans Yii
Question
J'ai créé 2 contrôleurs dans mon application Yii. FirstController.php et SecondController.php dans le chemin de contrôleur par défaut
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 fonctionnent pas.
Je suis newbee en POO et cadre Yii. Quel est le problème?
La solution
Je l'ai résolu ce problème. Le chargeur automatique ne charge pas les contrôleurs.
Il était config/main.php
:
'import' => array(
'application.models.*',
'application.components.*',
),
Tous les travaux avec ceci:
'import' => array(
'application.models.*',
'application.components.*',
'application.controllers.*',
),
Autres conseils
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
Lorsque vous créez un projet Yii, chacun de vos contrôleurs étendent la classe contrôleur, et cette classe étend la construction dans CController classe Yii.
C'est intéressant car contrôleur est une classe au sein de votre application (il peut être trouvé dans le dossier des composants).
Si vous voulez une méthode pour être accessible par les deux contrôleurs, mettez cette méthode dans la classe du contrôleur, et comme ils ont tous deux l'étendre. Ils ont tous deux accès. Assurez-vous de le déclarer soit public ou protégé.