Extending The Controller Class in CodeIgniter
Asked Answered
B

5

21

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?

Bussy answered 1/12, 2011 at 13:36 Comment(1)
I asked the same question [here][1] [1]: #7982687 Hope it helpsOutcry
G
30

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();
    }
...
}
Garb answered 1/12, 2011 at 14:0 Comment(2)
Probably worth mentioning that methods in MY_Controller should likely be prefixed with _, so that CI doesn't route them (since, by nature all methods you want to share with all controllers must be public).Coyne
Surely the shared methods can be protected instead of public. So they won't get routed, but will be accessible by the extending controllers.Todo
C
7

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
}
Customer answered 15/11, 2017 at 10:11 Comment(0)
H
7

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

require_once(APPPATH."controllers/MyParentController.php");
class MyChildController extends MyParentController {
...
Hookworm answered 29/11, 2018 at 23:6 Comment(0)
G
0

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

Gushy answered 1/12, 2011 at 14:31 Comment(7)
I think is not necesary that all the controllers are under CORE but only the base controllers.Outcry
@luso, I tried putting my_controllers in /controllers/core and Profile & OtherClass (op called it Index) in /controllers. Otherclass extends Profile extends My_controller. that throws error. Move Profile to /core and it works. Are you able to put Profile & OtherClass in /controllers and get it to work?Gushy
@Alexey Gerasimov I've moved Profile class to the application/core folder, but nothing have changed. I do recieve the same error. Does it matter what name have file or anything else? What have I missed?Bussy
take a look at #7628087 and philsturgeon.co.uk/blog/2010/02/…Garb
@Garb I got it. But is it a good practise to create an __autoload function, or better place all common classes in MY_Controller?Bussy
@Bussy Just me me, I tend to extend the core files in the way I described. Autoload in on the way out (php.net/manual/en/language.oop5.autoload.php), and I don't want to redo things. I'm too lazy!Garb
is not app/controllers/core but /app/coreOutcry
C
-1

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

Calm answered 22/1, 2017 at 9:23 Comment(3)
Comment the reason before down voting.Allfired
It's likely they love php, my apologies if I've offended anyone.Calm
They don't love PHP... Not all frameworks provide file handling and always need improvement.Allfired

© 2022 - 2024 — McMap. All rights reserved.