web-dev-qa-db-fra.com

Code Igniter 2: Comment étendre CI_Controller plusieurs fois?

J'ai réussi à étendre la classe CI_Controller en créant un fichier MY_Controller.php que j'ai placé dans le répertoire application/core.

core/My_Controller.php ressemble à ceci:

class MY_Controller extends CI_Controller {

    function __construct()
    {
        parent::__construct();
    }
}

Ensuite, lorsque je crée des contrôleurs normaux, ils ressemblent à ceci:

class Home extends MY_Controller {

    function __construct()
    {
        parent::__construct();
    }

    function index()
    {
        $this->load->view('home');
    }
}

Je crée un back-end admin et je souhaite avoir une classe de base différente pour les contrôleurs à étendre au lieu de My_Controller. C’est pour que je puisse avoir des méthodes communes pour les contrôleurs d’administration (c'est-à-dire authentication_check, etc.)

Ce que je ne peux pas comprendre, c'est comment créer un autre contrôleur qui étend CI_Controller.

L'objectif est que les contrôleurs d'administration étendent une classe de base différente de celle des contrôleurs frontaux.

Le contrôleur de base admin ressemblerait à ceci:

class MY_Admin_Controller extends CI_Controller {

    function __construct()
    {
        parent::__construct();
    }
}

Un contrôleur normal pour les pages d'administration:

class Admin_home extends MY_Admin_Controller {

    function __construct()
    {
        parent::__construct();
    }

    function index()
    {
        $this->load->view('admin_home');
    }
}

Le problème est que pour étendre la classe CI_Controller, vous devez nommer votre fichier de contrôleur PREFIX_Controller.php et le placer dans le répertoire core /. Mais je veux deux classes de contrôleur et elles ne peuvent pas avoir le même nom de fichier.

27
Camsoft

Vous venez de mettre les deux dans le même fichier, j'ai un projet qui est exactement le même. 

Nous avons juste à la fois le contrôleur étendu admin et normal dans le fichier MY_Controller.php, fonctionne bien.

La raison principale pour MY_Controller ou d'autres fichiers étendus est que CodeIgniter les initie automatiquement lorsque vous chargez le fichier de base (bibliothèque, utilitaire, etc.), vous pouvez avoir plusieurs classes dans ces fichiers.

Modifier:

Vous n'avez même pas besoin de les appeler MY_Admin_Controller ou MY_Controller, nous avons Admin_Controller et User_Controller et Ajax_Controller dans le fichier MY_Controller

28
Cubed Eye

Ce que tu fais est correct. Vous avez juste besoin de tous ces fichiers dans le répertoire application/core. Voici un post de Phil Sturgeon à ce sujet:

http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY
http://philsturgeon.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY/

L'astuce consiste à utiliser la fonction __autoload() - décrite par Phil dans son message.

17
swatkins

C'est assez facile. Faites ce qui suit:

  1. Allez dans le répertoire suivant: your_ci_app/application/core/ et créez un fichier php appelé MY_Controller.php (ce fichier sera l'endroit où vos classes parent supérieures résideront)
  2. Ouvrez le fichier que vous venez de créer et ajoutez vos classes multiples, comme ceci:

    class Admin_Parent extends CI_Controller {
        public function __construct() {
            parent::__construct();
        }
    
        public function test() {
            var_dump("from Admin_Parent");
        }
    }
    
    class User_Parent extends CI_Controller {
    
        public function __construct() {
            parent::__construct();
        }
    
        public function test(){
            var_dump("from User_Parent");
        }
    
    }
    
  3. Créez vos contrôleurs enfants dans ce répertoire your_ci_app/application/controllers/. Je l'appellerai adminchild.php

  4. Ouvrez adminchild.php et créez votre code de contrôleur, assurez-vous d'étendre le nom de la classe parente, comme suit:

    class Adminchild extends Admin_Parent {
    
        function __construct() {
            parent::__construct();
        }
    
        function test() {
            parent::test();
        }
    
    }
    
3
CodeGodie

si vous souhaitez étendre une autre classe au lieu de CI_controller, vous devez inclure la classe cible. par exemple

include 'auth.php';

class test extends Auth
1
Saman Salehi

Tous les fichiers du dossier application/noyau


MY est la sous-classe CI
MY a 2 sous-classes Public et Dashboard

class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    }
}

Publique

class Public_Controller extends My_Controller
{
    public function __construct()
    {
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    }
}

Le tableau de bord a 2 sous-classes, Admin et User

class Dashboard_Controller extends My_Controller
{
    public function __construct()
    {
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    }
}

Admin

class Admin_Controller extends Dashboard_Controller
{
    public function __construct()
    {
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    }
}

Utilisateur

class User_Controller extends Dashboard_Controller
{
    public function __construct()
    {
        parent::__construct();

        echo "This is " . __CLASS__ . "<br />";
    }
}

dans config/config.php

/* load class in core folder */
function my_load($class) {        
    if (strpos($class, 'CI_') !== 0) {            
        if (is_readable(APPPATH . 'core' . DIRECTORY_SEPARATOR . $class . '.php' )) {                
            require_once (APPPATH . 'core' . DIRECTORY_SEPARATOR . $class . '.php');                
        }
    }        
}

spl_autoload_register('my_load');

dans contrôleur/Home.php

//class Home extends MY_Controller {
//class Home extends Dashboard_Controller {
class Home extends Admin_Controller {

    public function index()
    {
        echo "This is " . __CLASS__ . "<br />";
        //$this->load->view('home');
    }
}
0
antelove