web-dev-qa-db-fra.com

Extension de la classe du contrôleur dans CodeDigniter

J'ai class MY_Controller extends CI_Controller et la logique commune pour la section de grand profil, donc i'va essayé de créer class Profile extends MY_Controller Avec la logique commune pour la section de profil et toutes les classes liées à cette section devraient prolonger cette classe de profil, car je comprends bien, mais quand j'ai essayé de créer class Index extends Profile Je reçois une erreur:

Fatal error: Class 'Profile' not found

Coundigniter tente de trouver cette classe dans index.php ce que je suis en cours d'exécution.

Où est mon erreur? Ou peut-être qu'il y a une meilleure façon de marquer la logique commune?

20
Yekver

Je suppose que vous avez mis votre my_Controller dans/Application/Core et définir le préfixe dans la configuration. Je ferais attention à utiliser l'index comme nom de classe. En tant que fonction/méthode dans le codeDigniter, il a un comportement dédié.

Si vous souhaitez alors étendre ce contrôleur, vous devez placer les classes dans le même fichier.

Par exemple. Core dans/Application

/* start of php file */
class MY_Controller extends CI_Controller {
    public function __construct() {
       parent::__construct();
    }
...
}

class another_controller extends MY_Controller {
    public function __construct() {
       parent::__construct();
    }
...
}
/* end of php file */

Dans/Application/Contrôleurs

class foo extends MY_Controller {
    public function __construct() {
       parent::__construct();
    }
...
}

ou

class bar extends another_controller {
    public function __construct() {
       parent::__construct();
    }
...
}
27
Rooneyl

J'ai trouvé cette page sur Google parce que j'avais le même problème. Je n'ai pas aimé les réponses énumérées ici, donc j'ai créé ma propre solution.

1) Placez votre classe mère dans le dossier core.

2) Placez une déclaration incluant au début de toutes les classes qui incluent la classe mère.

Donc, un contrôleur typique pourrait ressembler à ceci:

<?php

require_once APPPATH . 'core/Your_Base_Class.php';
// must use require_once instead of include or you will get an error when loading 404 pages

class NormalController extends Your_Base_Class
{
    public function __construct()
    {
        parent::__construct();

        // authentication/permissions code, or whatever you want to put here
    }

    // your methods go here
}

La raison pour laquelle j'aime cette solution est que l'ensemble du point de créer une classe mère est de réduire la répétition de code. Je n'aime donc pas l'autre réponse qui a suggéré de copier/coller la classe des parents dans toutes vos classes de contrôleur.

5
AdmiralAdama

Il est possible avec codeigniter 3. Il suffit d'inclure le fichier parent suffisant.

require_once(APPPATH."controllers/MyParentController.php");
class MyChildController extends MyParentController {
...
1
Cem Yıldız

Toutes les classes que vous extensionnez devraient vivre dans l'application/centre de base, donc dans votre cas My_Controller et votre profil devraient y vivre. Tous les contrôleurs de "point final" vivront dans le dossier de l'application/des contrôleurs

MISE À JOUR

Je me suis trompé. Les classes étendues devraient vivre dans le même fichier. La réponse de RoonyL montre comment mettre en œuvre

0
Alexey Gerasimov