2013-01-04 2 views
5
class SomeController extends Controller 
{ 

     public function actionIndex() { 
       echo 'This is some controller'; 
     } 
} 


class AnotherController extends SomeController 
{ 

     public function actionIndex() { 
       echo 'This is another controller'; 
     } 
} 

Cela fonctionne:Yû - Héritant de la classe contrôleur personnalisé - Introuvable

index.php?r=some 

mais ...

index.php?r=another 

dit:

avertissement PHP

comprennent (SomeController.php): failed to open stream: Aucun fichier ou répertoire

Les deux fichiers sont en

test\protected\controllers\ 

BTW dans le passé, je également essayé d'utiliser le générateur de contrôleur avec Gii "SomeController" comme la classe de base ...

il a dit:

The controller has been generated successfully. You may try it now. 

Generating code using template 
"C:\xampp\htdocs\yii\framework\gii\generators\controller\templates\default"... 
generated controllers\YetAnotherController.php 
generated views\yetAnother\index.php 
done! 

Quand je clique sur "essayer maintenant" il a également dit:

avertissement PHP

comprennent (SomeController.php): failed to open stream: Aucun fichier ou répertoire

Répondre

11

Edit:

classes à l'intérieur protégées/controllers ne sont pas chargés automatiquement, vous devrez donc importer le fichier de classe parent avant de l'étendre:

En AnotherController.php:

Yii::import('application.controllers.SomeController'); 
public class AnotherController extends SomeController { 
    // ... 
} 

Incase vous devez accéder à la classe de base url aussi, vous pouvez utiliser la méthode ci-dessus. Sinon, vous pouvez mettre votre classe de base à l'intérieur protected/components comme vous l'avez déjà compris.


Yii le chargement automatique fonctionne uniquement lorsque vous avez le même nom pour le fichier que la classe que le fichier contient. Signification class SomeController doit être dans fichier SomeController.php.

Apportez ces modifications et cela devrait fonctionner. Un wiki utile: Understanding Autoloading Helper Classes and Helper functions.

Guide link:

fichiers de classe doivent être nommés d'après la classe publique qu'ils contiennent.

+0

Oui c'est dans \ protected \ controllers \ SomeController.php BTW comme je l'ai dit "http: //localhost/yii/testapp/index.php? R = some" fonctionne ... Mais "YetAnotherController.php" de gii (index .php? r = yetAnother) et mon "AnotherController.php" (index.php? r = autre) donnent des erreurs sur leur classe de base (SomeController.php). Il semble y avoir un problème avec le chargement automatique de SomeController.php lorsqu'il s'agit de la classe de base, mais cela fonctionne très bien si j'utilise index.php? R = some. Aussi je reçois la même erreur quand je référence Post.php dans un contrôleur ... il est dans models/Post.php ... –

+0

oh ok, alors allez-vous accéder au contrôleur de base à partir de l'URL? ou est-ce juste une classe de base, et vous souhaitez seulement l'utiliser comme tel? –

+0

Je me demandais si je pouvais faire les deux? –

3

Pour étendre une classe tout simplement au fichier de configuration et ajoutez la classe dans la section d'importation

'import' => array('application.controllers.SomeController')

cela rendra disponible dans l'application entière, sans importer explicitement.

+0

Merci pour le bon conseil! – wallerjake

Questions connexes