2011-01-05 8 views
9

Ho seguito rigorosamente il how-to article by Phil Sturgeon, per estendere il controller di base. Ma ottengo ancora alcuni errori.Codeigniter esteso esteso MY_Controller

mie 3 classi:

// 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 è che il seguente frammento funziona, se si estende direttamente dal MY_Controller:

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

ho caricato i controllori tramite __autoload() o manualmente . I controller sono stati caricati con successo.

CI-Version: 1.7.3

+0

Caricamento di MY_Controller.php prima che venga caricato Public_Controller.php? – Alisson

+0

Potresti postare la funzione __autoload in config.php? –

+0

Ci sono molte risposte migliori in questa domanda: http://stackoverflow.com/questions/21663045/creating-a-core-class-that-extends-another-core-class-codeigniter/22125436#22125436 anche se è marcato come duplicato di questo – Chococroc

risposta

5

È necessario, per i controller pubblico nella vostra mio_controllore

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

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

Si ottiene l'errore perché Public_Controller non è mai stato caricato. Questo ti permetterebbe di estendere da Public_Controller

Mi piace quello che stai facendo perché lo faccio sempre.

Si può fare questo anche nel vostro mio_controllore quando si desidera creare 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

Questo non dovrebbe essere necessario se __autoload funziona. –

+0

@Phil, ha perso quella parte nel tuo post :) –

+0

Oh. "Ho caricato i controller tramite __autoload() o manualmente." Chi lo sa :) –

5

è necessario posizionare Public_controller con MY_Controller all'interno 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(); 

    }  
} 

Io uso __construct ovunque e funziona benissimo Recentemente ho scritto fino an article su come fare questo in relazione al wrapping della tua logica di autenticazione nei tuoi controller estesi. È circa a metà strada quando inizio a discutere sulla costruzione dei controller.

1

Ho avuto un problema come questo, dopo qualche ricerca ho trovato che l'errore è stato effettuato io stesso, perché il mio nome della classe controller era MY_Controller ma il nome del file era My_Controller [Caso non corrispondente]. Nota: - In localhost non ho avuto alcun errore.

controller estesa io uso

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

anche io ottenuto l'errore.

Dopo aver cambiato il nome del mio file in MY_Controller ha iniziato a funzionare bene.

0

Ho una classe di controller personalizzata denominata MY_Controller estende CI_Controller e funziona correttamente. Si trova nell'applicazione/core e ha funzioni personalizzate che caricano le visualizzazioni nel mio sito.

Io uso una classe astratta My_app_controller che si estende per MY_Controller behabior specifica my_app, voglio che ogni controller my_app di estendere questa classe astratta.(Io uso le applicazioni diferent nel sito, in modo da alcune applicazioni dirigerò la My_app_controller e altre applicazioni dirigerò la My_other_apps_controllers)

Ma quando provo ad estendere My_app_controller da qualsiasi controller nella mia domanda, "Main_app_controller extends My_app_controller" genera una Class ' My_app_controller 'not found exception.

ho trovato due soluzioni:

  1. uso include_once nel file di Main_app_controller.php.
    include_once APPPATH.'controllers/path/to/My_app_controler.php';

  2. rompere la regola "una classe per file" di codeigniter e definire il mio My_app_controller proprio nello stesso file MY_Controller è (sotto application/core).

manuale dice:

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

Beh ... sono.

In ogni caso, ho preferito utilizzare la soluzione include_once perché penso che sia meglio avere un file per classe e My_app_controller si trova nella cartella application/controller/my_app. (quindi esistono applicazioni/controller/altre_apps)

Problemi correlati