creando una clase principal que amplía otro codificador de clase principal

class Settings extends USER_Controller {...} class USER_Controller extends MY_Controller {...}//limit access to user and define some params and functions that is user depended class MY_Controller extends CI_Controller {...}//provide extra functionality accross all controllers 

Bueno, si bash crear clases superiores a 3 esto no funcionará.

sin embargo, si solo uso la settings extends MY_Controller , funcionará bien.

Entonces, ¿hay alguna manera de que pueda poner una clase media entre mi controlador y MY_Controller -el controlador base que extiende el controlador_CI?

Como dijo @Minhaz Ahmed , el problema es cargar la clase. Codeigniter solo carga la clase con el prefijo de subclase como en,

https://github.com/EllisLab/CodeIgniter/blob/develop/system/core/CodeIgniter.php#L276

 if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php')) { require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'; } 

Así que, después de algunas excavaciones, vine con una solución que utiliza los ganchos de spl_​autoload_​register() y spl_​autoload_​register() para mi proyecto sin hackear el CORE. Por favor, siga los pasos para lograr lo que está en la pregunta .

  1. Habilita los ganchos en el archivo de configuración si no lo está ya.

  2. cree un gancho en application / config / hooks.php como se muestra a continuación.

    $hook['pre_system'] = array( 'class' => '', 'function' => 'autoload', 'filename' => 'autoload.php', 'filepath' => 'hooks', 'params' => '' );

  3. Crea el autoload.php en la carpeta application/hooks .

  4. dentro del archivo autoload.php ,

    function autoload() { spl_autoload_register(function($class) { if(strpos($class,'CI_') !== 0 && file_exists(APPPATH.'core/'.$class.EXT)) { require_once APPPATH . 'core/' . $class . EXT; } }); }

Eso es.

Nota: Aquí, he usado el gancho pre_system , no el pre_controller , ya que codeigniter carga las clases del controlador base entre los ganchos pre_system y pre_controller .

Espero que esto ayude. Si hay algún problema con esto por favor haga comentarios.

Coloque el archivo de clase user_controller al final de MY_Controller.php

MY_Controller.php en / application / core /

 class MY_Controller extends CI_Controller {...} class USER_Controller extends MY_Controller {...} 

Ahora, desde su controlador en su carpeta de controladores, puede extender el controlador desde USER_Controller:

  class Settings extends USER_Controller {...} 

¿Qué hizo el mejor trabajo para CI 2.1.4:
aplicación / núcleo

crear por ejemplo:
– base_controller (instrucciones base, extendiéndose desde ci_controller)
– admin_controller (se extiende desde el controlador de base y agrega instrucciones de autenticación)

Luego úsalos en: aplicación / controladores:
por ejemplo:
usuarios de la clase se extiende admin_controller …

Podrías usar la solución central de Phil, es simple y fácil.

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

Puede extender la clase de la forma que desee, pero el problema es cargar la clase, debe incluir su USER_Controller su Clase de Settings . El problema no es extender el problema es incluir el archivo, por lo que debe encontrar una manera de incluir la segunda clase.

Ver http://www.php.net/manual/en/function.spl-autoload.php