2011-12-01 14 views
14

Ho class MY_Controller extends CI_Controller e la logica comune per la sezione big profile, quindi ho cercato di creare class Profile extends MY_Controller con logica comune per la sezione profilo e tutte le classi correlate a questa sezione dovrebbero estendere questa classe Profile come ho capito bene , ma quando ho cercato di creare class Index extends Profile ricevo un errore:Estendere la classe controller in CodeIgniter

Fatal error: Class 'Profile' not found 

CodeIgniter cerca di trovare questa classe in index.php che sto facendo funzionare.

Dov'è il mio errore? O forse c'è un modo migliore per discriminare la logica comune?

+0

ho chiesto la stessa domanda [qui] [1] [1]: http://stackoverflow.com/questions/7982187/codeigniter-extending-common-controller Speranza che aiuta – luso

risposta

24

Suppongo che tu abbia messo il tuo MY_Controller in/application/core, e imposta il prefisso nella configurazione. Farei comunque attenzione all'utilizzo dell'indice come nome di classe. Come funzione/metodo in Codeigniter ha un comportamento dedicato.

Se si desidera estendere tale controller, è necessario inserire le classi nello stesso file.

E.g. In/applicazione principale

/* start of php file */ 
class MY_Controller extends CI_Controller { 
    public function __construct() { 
     parent::__construct(); 
    } 
... 
} 

class another_controller extends MY_Controller { 
    public function __construct() { 
     parent::__construct(); 
    } 
... 
} 
/* end of php file */ 

A/applicazione/controller

class foo extends MY_Controller { 
    public function __construct() { 
     parent::__construct(); 
    } 
... 
} 

o

class bar extends another_controller { 
    public function __construct() { 
     parent::__construct(); 
    } 
... 
} 
+0

Probabilmente vale la pena menzionare che i metodi in 'MY_Controller' dovrebbero _likely_ essere prefissati con' _', in modo che CI non li instradi (poiché, per natura, tutti i metodi che si desidera condividere con tutti i controller devono essere pubblici). –

+5

Sicuramente i metodi condivisi possono essere protetti anziché pubblici. Quindi non verranno instradati, ma saranno accessibili dai controller estesi. – manavo

0

Tutte le classi che si sta estendendo dovrebbe vivere nella directory dell'applicazione/core così nel tuo caso sia mio_controllore e Il profilo dovrebbe vivere lì. Tutti gli "end point" controllori vivranno in application/cartella controllori

UPDATE

mi correggo. Le classi estese dovrebbero vivere nello stesso file. @ Risposta di Rooneyl mostra come implementare

+0

Penso che non sia necessario che tutti i controller siano in CORE ma solo i controller di base. – luso

+0

@luso, ho provato a mettere my_controllers in/controller/core e Profile & OtherClass (op detto Index) in/controller. Otherclass estende il profilo estende My_controller. che genera errore Sposta il profilo in/core e funziona. Sei in grado di mettere Profile & OtherClass in/controller e farlo funzionare? –

+0

@Alexey Gerasimov Ho spostato la classe Profile nella cartella application/core, ma nulla è cambiato. Ricevo lo stesso errore. Importa quale nome ha il file o qualcos'altro? Cosa mi sono perso? – Yekver

-2

Dopo una lotta con la versione 3 e questo problema ho deciso che questo non era una cattiva soluzione ...

require_once BASEPATH.'core/Controller.php'; 
require_once APPPATH.'core/MYCI_Controller.php'; 

aggiungere questa seconda linea dove il primo esiste nel sistema /core/CodeIgniter.php

[Se non è troppo tardi, vi consiglio vivamente di php e/o CodeIgniter.]

+0

Commenta il motivo prima di votare. –

+0

È probabile che amino php, mi scuso se ho offeso qualcuno. –

+0

Non amano il PHP ... Non tutti i framework forniscono la gestione dei file e hanno sempre bisogno di miglioramenti. –

0

ho trovato questa pagina su Google perché ho avuto lo stesso problema. Non mi piacevano le risposte elencate qui, quindi ho creato la mia soluzione.

1) Inserire la classe genitore nella cartella core.

2) Inserire un'istruzione include all'inizio di tutte le classi che includono la classe padre.

Quindi un controller tipico potrebbe assomigliare a questo:

<?php 

require_once APPPATH . 'core/Your_Base_Class.php'; 
// must use require_once instead of include or you will get an error when loading 404 pages 

class NormalController extends Your_Base_Class 
{ 
    public function __construct() 
    { 
     parent::__construct(); 

     // authentication/permissions code, or whatever you want to put here 
    } 

    // your methods go here 
} 

La ragione per cui mi piace questa soluzione è, il punto di creare una classe genitore è quello di ridurre la ripetizione del codice.Quindi non mi piace l'altra risposta che suggeriva di copiare/incollare la classe genitore in tutte le classi del controllore.

Problemi correlati