Question

Je class MY_Controller extends CI_Controller et logique commune pour la grande section de profil, donc I'va a essayé de créer class Profile extends MY_Controller avec une logique commune pour la section de profil et toutes sortes liées à cette section devrait étend ce profil classe que 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

CodeIgniter essaie de trouver cette classe index.php que je suis en cours d'exécution.

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

Était-ce utile?

La solution

I take it you have put your MY_Controller in /application/core, and set the prefix in the config. I would be careful about using index as a class name though. As a function/method in Codeigniter it has a dedicated behaviour.

If you then want to extend that controller you need to put the classes in the same file.

E.g. In /application core

/* 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 */

In /application/controllers

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

or

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

Autres conseils

I found this page on Google because I had the same problem. I didn't like the answers listed here so I created my own solution.

1) Place your parent class in the core folder.

2) Place an include statement at the beginning of all classes that include the parent class.

So a typical controller might look like this:

<?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
}

The reason I like this solution is, the whole point of creating a parent class is to cut down on code repetition. So I don't like the other answer that suggested copy/pasting the parent class into all of your controller classes.

It is possible with Codeigniter 3. Just including the parent file is enough.

require_once(APPPATH."controllers/MyParentController.php");
class MyChildController extends MyParentController {
...

All classes you are extending should live in application/CORE directory so in your case both My_Controller and Profile should live there. All "end point" controllers will live in application/controllers folder

UPDATE

I stand corrected. Extended classes should live in the same file. @Rooneyl's answer shows how to implement

After some struggle with version 3 and this issue I decided this was not a bad solution...

require_once BASEPATH.'core/Controller.php';
require_once APPPATH.'core/MYCI_Controller.php';

to add this second line where the first exists in the system/core/CodeIgniter.php

[If it's not too late, I recommend strongly against php and/or CodeIgniter.]

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top