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.
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
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.
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:
- Vaya al siguiente directorio:
your_ci_app/application/core/
y cree un archivo php llamadoMY_Controller.php
(este archivo será donde residirán sus clases principales) -
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"); } }
Cree sus controladores hijos bajo este directorio
your_ci_app/application/controllers/
. Lo llamaréadminchild.php
-
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(); } }
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
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');
}
}
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