Yekver
Yekver

Reputation: 5193

Extending The Controller Class in CodeIgniter

I have class MY_Controller extends CI_Controller and common logic for big profile section, so I'va tried to create class Profile extends MY_Controller with common logic for profile section and all class related to this section should extends this Profile class as I understand right, but when I tried to create class Index extends Profile I recieve an error:

Fatal error: Class 'Profile' not found

CodeIgniter tries to find this class in index.php which I am running.

Where is my mistake? Or maybe there is anoter better way to mark out common logic?

Upvotes: 21

Views: 43239

Answers (5)

RedDragonWebDesign
RedDragonWebDesign

Reputation: 2581

A solution that doesn't require copy/pasting the parent class into all your controller classes:

  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
}

Upvotes: 7

Cem Yıldız
Cem Yıldız

Reputation: 142

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

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

Upvotes: 7

Master James
Master James

Reputation: 1787

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.]

Upvotes: -1

Alexey Gerasimov
Alexey Gerasimov

Reputation: 2141

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

Upvotes: 0

Rooneyl
Rooneyl

Reputation: 7902

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();
    }
...
}

Upvotes: 30

Related Questions