2012-03-24 15 views
5

Sono provare qualcosa da questo commento idea Code Igniter Controller/Model name conflictsregolatore Codeigniter e il modello con lo stesso nome Collison

ritrovamento variabile nome della classe sul core/CodeIgniter.php:

$class = $RTR->fetch_class(); e cambiare così:
$class = 'Controller' . $RTR->fetch_class();

ora cambiare il nome del controller:

class ControllerUser extends CI_Controller { ...

Funziona, ora posso usare il modello utente e il controller utente. Ma la mia domanda è: ha senso? o il problema? (scusate il mio pessimo inglese)

+0

Ecco perché dovresti provare a trovare un framework che ti permetta di lavorare con PHP5.3 [namespace] (http://php.net/manual/en/language.namespaces.php). Per quanto odio quel framework, FuelPHP potrebbe essere il passo logico per te. La sua forcella CI piuttosto nuova. Questo è, naturalmente, se hai il controllo su quale framework è usato o se sei nella fase in cui è possibile. Altrimenti ... tienilo in considerazione quando prendi il prossimo progetto. –

+0

Non so da dove viene l'idea di FuelPHP è un fork di CI. Non è, è stato costruito da zero, non ha nulla in comune con CI e non è compatibile. – WanWizard

risposta

5

Per ovviare a questo problema, di solito la maggior parte delle persone aggiungere il suffisso '_model' per i nomi di classe Modello

penso che è meglio aggiungere un suffisso per i controllori, invece, dal momento che sono quasi mai riferimento da loro classe nomi nel tuo codice.

Per prima cosa è necessario estendere la classe del router.

Creare questo file: “application/librerie/MY_Router.php”

class MY_Router extends CI_Router { 
    var $suffix = '_controller'; 

    function __construct() { 
     parent::CI_Router(); 
    } 

    function set_class($class) { 
     $this->class = $class . $this->suffix; 
    } 

    function controller_name() { 

     if (strstr($this->class, $this->suffix)) { 
      return str_replace($this->suffix, '', $this->class); 
     } 
     else { 
      return $this->class; 
     } 

    } 
} 

Ora modifica “Sistema/codeigniter/CodeIgniter.php”

linea 153:

if (! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->controller_name().EXT)) 

linea 158:

include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->controller_name().EXT); 

successivo, modificare: “Sistema/librerie/Profiler.php”, la linea 323:

$output .= " 
<div style="color:#995300;font-weight:normal;padding:4px 0 4px 0">".$this->CI->router->controller_name()."/".$this->CI->router->fetch_method()."</div>"; 

Source

+0

non ha funzionato. 404 non trovato. – musa

+0

@musa, che era con la soluzione hmvc, controllare la mia modifica e aggiornare – Starx

+0

non dovrebbe essere 'parent :: __ construct()'? Da PHP5 c'è stato un cambiamento nel modo in cui si esegue la costruzione ... quindi ancora CI è ancora framework semi-php4. –

1

Sì, questo fa sence. Codeigniter è un rigoroso framework orientato agli oggetti. Questo significa che quando hai 2 o più oggetti con lo stesso nome, il nome dell'oggetto non è abbastanza unico.

Nel tuo caso un modello è un processore di dati e un controller la classe che collega la tua vista al modello. Quindi, logicamente è necessario denominare qualcosa di simile:

Il modello sarà: "Model_User", "DB_USER" o "UserList"

Il controller sarà: "Utente", Controller_User o UserController

Nel caso del modello ti suggerisco di usare Db_User (nomi brevi ma chiari) e nel caso dei controller ti suggerisco di usare "Utente" (breve e la classe che definisce l'utente quando è combinato con il modello e la vista per quell'utente)

Non ho mai avuto problemi con i miei sistemi Codeigniter come questo

+0

Non sto usando plurale perché sto parlando di una lista o di un tavolo. Gli utenti, ad esempio, sono proprietà strettamente parlate di un elenco –

7

non vorrei modificare il nucleo di CodeIgniter. Quando esegui l'upgrade, perdi questa modifica.

Ho fatto due cose in passato: 1. Denominati i miei modelli User_model 2. Ho nominato i miei controller come plurale, e i miei modelli come singolari.

Faccio quest'ultimo ora. Anche questo semanticamente ha senso, perché il nome del controller si trova nell'URL, quindi i percorsi sembrano app percorso/utenti/nome utente. Inoltre, il modello di solito modella un singolo utente, quindi anche questo ha un senso.

È anche possibile seguire una certa discussione da parte della comunità su questa questione qui: http://codeigniter.uservoice.com/forums/40508-codeigniter-reactor/suggestions/1269847-controller-prefixes

+0

Sto usando datamapper, quindi non voglio rendere User_model. ma sì, i modelli User, i controller possono essere gli utenti. inoltre ho trovato questo http://phpfour.com/blog/2009/09/codeigniter-controller-naming-convention-modified/ cosa ne pensi? – musa

+0

per quanto riguarda il # 2, finora ha senso, e penso che questo è un po 'più SEO friendly, ma vorrei avere più riferimenti su questo. – Jahmic

1

Perché non basta fare i controller di singolare e il vostro modelli/db tavoli plurale?

Problemi correlati