Encendedor de código 2: ¿Cómo extender el controlador CI varias veces?


He extendido con éxito la clase CI_Controller creando un MY_Controller.php que he colocado en el directorio application/core.

Core / MY_Controller.php se ve algo como esto:

class MY_Controller extends CI_Controller {

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

Entonces cuando creo controladores normales se ven algo como esto:

class Home extends MY_Controller {

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

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

Estoy creando un back-end de administración y quiero tener una clase base diferente para que los controladores se extiendan en lugar de MY_Controller. Esto es para que pueda tener métodos comunes para los controladores de administración (es decir, authentication_check, etc.)

Lo que no puedo averiguar es cómo crear otro controlador que extienda CI_Controller.

El objetivo es que los controladores admin extiendan una clase base diferente a los controladores front-end.

El controlador de la base de administración se vería así:

class MY_Admin_Controller extends CI_Controller {

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

Un controlador normal para páginas de administración:

class Admin_home extends MY_Admin_Controller {

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

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

El problema es que para extender la clase CI_Controller debe nombrar su archivo controlador PREFIX_Controller.php y colocarlo en el directorio core/. Pero quiero dos clases de controladores y no pueden tener el mismo nombre de archivo.

Author: tereško, 2011-10-02

5 answers

Usted acaba de poner ambos en el mismo archivo, tengo un proyecto que es exactamente el mismo que este.

Solo tenemos el controlador extendido admin y normal en el archivo MY_Controller.php, funciona bien.

La razón principal para el MY_Controller u otros archivos extendidos es para que CodeIgniter los inicie automáticamente cuando cargue el archivo base (ya sea biblioteca, ayudante, etc.).), puede tener muchas clases en estos archivos.

Editar:

Ni siquiera necesitas llamarlos MY_Admin_Controller o MY_Controller, tenemos Admin_Controller y User_Controller y Ajax_Controller en el Archivo MY_Controller

 28
Author: Cubed Eye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-02 16:30:12

Lo que estás haciendo es correcto. Solo necesita todos estos archivos en el directorio application/core. Aquí hay un post de Phil Sturgeon con respecto a esto:

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/

El truco es usar la función __autoload() - que Phil describe en su post.

 17
Author: swatkins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-26 08:03:12

Esto es bastante fácil. Haga lo siguiente:

  1. Vaya al siguiente directorio: your_ci_app/application/core/ y cree un archivo php llamado MY_Controller.php (este archivo será donde residirán sus clases principales)
  2. Abra este archivo que acaba de crear y agregue sus múltiples clases, así:

    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. Cree sus controladores hijos bajo este directorio your_ci_app/application/controllers/ . Lo llamaré adminchild.php

  4. Abra adminchild.php y cree su código de controlador, asegúrese de extender el nombre de la clase padre, así:

    class Adminchild extends Admin_Parent {
    
        function __construct() {
            parent::__construct();
        }
    
        function test() {
            parent::test();
        }
    
    }
    
 3
Author: CodeGodie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-05 17:11:22

Si desea extender otra clase en lugar de CI_controller, debe incluir la clase de destino. por ejemplo

include 'auth.php';

class test extends Auth
 1
Author: Saman Salehi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-18 07:56:59

Todos los archivos de la carpeta application / core


MI subclase is CI
Tengo 2 subclases Públicas y Dashboard
class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();

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

Público

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

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

El panel tiene 2 subclases, Admin y 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 />";
    }
}

Usuario

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

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

En 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');

En controller/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
Author: antelove,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-14 06:44:40