2011-01-05 14 views
9

He seguido estrictamente el how-to article by Phil Sturgeon, para extender el controlador base. Pero todavía tengo algunos errores.Codeigniter extendiendo extendido MY_Controller

Mis 3 clases:

// application/libraries/MY_Controller.php 
class MY_Controller extends Controller{ 
    public function __construct(){ 
     parent::__construct(); 
    } 
} 

// application/libraries/Public_Controller.php 
class Public_Controller extends MY_Controller{ 
    public function __construct(){ 
     parent::__construct(); 

    }  
} 

// application/controllers/user.php 
class User extends Public_Controller{ 
    public function __construct(){ 
     parent::__construct(); 
    } 
} 

Fatal error: Class 'Public_Controller' not found in /srv/www/xxx/application/controllers/user.php on line 2

curioso es que el siguiente fragmento está funcionando, si se extiende directamente desde MY_Controller:

// application/controllers/user.php 
class User extends MY_Controller{ 
    public function __construct(){ 
     parent::__construct(); 
    } 
} 

I han cargado los controladores a través de __autoload() o manualmente . Los controladores están cargados con éxito.

CI-Version: 1.7.3

+0

¿Está cargando MY_Controller.php antes de cargar Public_Controller.php? – Alisson

+0

¿Podría publicar la función __autoload en config.php? –

+0

Hay respuestas mucho mejores en esta pregunta: http://stackoverflow.com/questions/21663045/creating-a-core-class-that-extends-another-core-class-codeigniter/22125436#22125436 incluso si está marcado como duplicado de este – Chococroc

Respuesta

5

Necesitas requerir el controlador Pública en su MY_Controller

// application/libraries/MY_Controller.php 
class MY_Controller extends Controller{ 
    public function __construct(){ 
     parent::__construct(); 
    } 
} 

require(APPPATH.'libraries/Public_Controller.php'); 

se obtiene el error debido Public_Controller nunca fue cargado. Hacer esto le permitiría extender desde Public_Controller

Me gusta lo que está haciendo porque lo hago todo el tiempo.

Usted puede hacer esto también en su MY_Controller cuando se quiere crear un Admin_Controller

// application/libraries/MY_Controller.php 
class MY_Controller extends Controller{ 
    public function __construct(){ 
     parent::__construct(); 
    } 
} 

require(APPPATH.'libraries/Public_Controller.php'); // contains some logic applicable only to `public` controllers 
require(APPPATH.'libraries/Admin_Controller.php'); // contains some logic applicable only to `admin` controllers 
+2

Esto no debería ocurrir si __autoload está funcionando. –

+0

@Phil, se perdió esa parte en su publicación :) –

+0

Oh. "He cargado los controladores a través de __autoload() o manualmente". Quién sabe :) –

5

debe colocar Public_controller en el interior con MY_Controller MY_Controller.php

// application/libraries/MY_Controller.php 
class MY_Controller extends Controller{ 
    public function __construct(){ 
     parent::__construct(); 
    } 
} 

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

    }  
} 

utilizo __construct todas partes y funciona bien recientemente escribí an article sobre cómo hacerlo esto en relación con envolver su lógica de autenticación en sus controladores extendidos. Está a mitad de camino cuando empiezo a hablar sobre la construcción de los controladores.

1

Tuve un problema como este, después de buscar encontré que el error se cometió yo mismo, porque mi nombre de clase de controlador era MY_Controller pero el nombre del archivo era My_Controller [Case not matching]. Nota: - En localhost no tuve ningún error.

En extendida controlador I Use

class Home extends MY_Controller{ 
    function __construct() { 
    parent::__construct(); 
    } 
} 

Incluso tengo el error.

Después de cambiar mi nombre de archivo a MY_Controller, comenzó a funcionar bien.

0

Tengo una clase de controlador personalizado llamado MY_Controller extiende CI_Controller y funciona bien. Está ubicado en application/core y tiene funciones personalizadas para cargar vistas en mi sitio.

utilizo una clase abstracta My_app_controller que se extiende MY_Controller para my_app behabior específica, quiero todos los controladores de my_app extender esta clase abstracta.(Utilizo diferentes aplicaciones en el sitio, por lo que algunas aplicaciones se extienden My_app_controller y otras aplicaciones extiendo My_other_apps_controllers)

Pero cuando intento de extender My_app_controller desde cualquier controlador en mi solicitud, "Main_app_controller extends My_app_controller" genera una clase ' My_app_controller 'not found excepción.

He encontrado dos soluciones:

  1. uso include_once en el archivo Main_app_controller.php.
    include_once APPPATH.'controllers/path/to/My_app_controler.php';

  2. romper el "una clase por archivo" regla de encendedor de código y definir mi My_app_controller justo en el mismo archivo es MY_Controller (con aplicación/núcleo).

Manual dice:

Use separate files for each class, unless the classes are closely related

Bueno ... que son.

De todos modos, prefería usar la solución include_once porque creo que es mejor tener un archivo por clase y My_app_controller está ubicado en la carpeta application/controllers/my_app. (entonces existirán application/controllers/other_apps)