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.
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
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.
C'est assez facile. Faites ce qui suit:
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)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");
}
}
Créez vos contrôleurs enfants dans ce répertoire your_ci_app/application/controllers/
. Je l'appellerai adminchild.php
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();
}
}
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
Tous les fichiers du dossier application/noyau
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');
}
}