2011-01-05 7 views
9

J'ai strictement suivi le how-to article by Phil Sturgeon, pour étendre le contrôleur de base. Mais j'ai encore quelques erreurs.Codeigniter étendu étendu MY_Controller

Mes 3 classes:

// 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

curieux est que l'extrait suivant fonctionne, si j'étend directement à partir de MY_Controller:

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

I ont chargé les contrôleurs via __autoload() ou manuellement . Les contrôleurs sont chargés avec succès.

CI-Version: 1.7.3

+0

Chargement de MY_Controller.php avant le chargement de Public_Controller.php? – Alisson

+0

Pourriez-vous publier la fonction __autoload dans config.php? –

+0

Il y a beaucoup de meilleures réponses dans cette question: http://stackoverflow.com/questions/21663045/creating-a-core-class-that-extends-another-core-class-codeigniter/22125436#22125436 même si elle est marquée en tant que doublon de ceci – Chococroc

Répondre

5

Vous devez exiger que le contrôleur public dans votre MY_Controller

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

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

Vous obtenez l'erreur parce que Public_Controller n'a jamais été chargé. Cela vous permettrait de prolonger de Public_Controller

J'aime ce que vous faites parce que je le fais tout le temps.

Vous pouvez le faire aussi dans votre MY_Controller lorsque vous voulez créer 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

Cela ne devrait pas se produire si __autoload fonctionne. –

+0

@Phil, il a raté cette partie dans votre message :) –

+0

Oh. "J'ai chargé les contrôleurs via __autoload() ou manuellement." Qui sait :) –

5

Vous devez placer Public_controller avec MY_Controller intérieur 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(); 

    }  
} 

J'utilise __construct partout et il fonctionne très bien je l'ai écrit récemment en an article sur la façon de faire ceci par rapport à l'encapsulation de votre logique d'authentification dans vos contrôleurs étendus. C'est à mi-chemin quand je commence à discuter de la construction de vos contrôleurs.

1

J'ai eu un problème comme ceci, Après une recherche j'ai trouvé l'erreur a été faite moi-même, Parce que mon nom de contrôleur était MY_Controller mais le nom de fichier était My_Controller [Case not matching]. Note: - Dans localhost je n'ai eu aucune erreur.

Dans le contrôleur étendu I Utilisez

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

même j'ai eu l'erreur. Après avoir changé mon nom de fichier en MY_Controller, il a commencé à bien fonctionner.

0

J'ai une classe de contrôleur personnalisé appelé MY_Controller il étend CI_Controller et cela fonctionne très bien. Il est situé à l'application/noyau et il a des fonctions personnalisées pour charger les vues sur mon site.

J'utilise une classe abstraite My_app_controller qui s'étend MY_Controller pour behabior spécifique my_app, je veux que chaque contrôleur my_app étendre cette classe abstraite.(J'utilise des applications diférentes dans le site, de sorte que certaines applications prolongerai My_app_controller et d'autres applications prolongerai My_other_apps_controllers)

Mais lorsque je tente d'étendre My_app_controller de tout contrôleur dans ma demande, « Main_app_controller extends My_app_controller » génère une classe ' Mon_app_controller 'exception introuvable.

J'ai trouvé deux solutions:

  1. utilisation include_once dans le fichier Main_app_controller.php.
    include_once APPPATH.'controllers/path/to/My_app_controler.php';

  2. briser la règle « une classe par fichier » de CodeIgniter et définir mon My_app_controller juste dans le même fichier MY_Controller est (en application/core).

Manuel dit:

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

Eh bien ... ils sont.

De toute façon, j'ai préféré utiliser la solution include_once car je pense qu'il est préférable d'avoir un fichier par classe et My_app_controller se trouve sous le dossier application/controllers/my_app. (donc application/controllers/other_apps existera)