Il reindirizzamento è più pulito; caricare una vista potrebbe funzionare anche.
Il problema qui è che show_404() viene in genere chiamato DOPO che il controller è già stato caricato (qualcosa doveva dire che mostra il 404 dopo tutto). A CI non piace caricare un secondo controller in quel punto, che è l'ostacolo principale.
L'opzione migliore probabilmente sta estendendo la funzione show_404() nella classe Exceptions per reindirizzare alla route 404. Senza un reindirizzamento, sarai bloccato a mostrare una vista o qualcosa che tu sai abbia tutti i "dati extra" di cui ha bisogno prima di chiamare il 404 (o suppongo che potresti caricarlo anche nella classe Exceptions). Può diventare davvero complicato in alcune viste dinamiche.
Ovviamente si desidera qualcosa di più avanzato rispetto alla semplice modifica del modello 404 nella cartella degli errori. Ho avuto problemi nel tentativo di accedere a get_instance() da quel file, poiché a volte è caricato prima che il controller sia costruito. Quindi, fate attenzione se si tenta che;)
Aggiornamento: Ecco un esempio di lavoro di estendere la funzione show_404() per caricare una vista
<?php
// application/core/MY_Exceptions.php
class MY_Exceptions extends CI_Exceptions {
public function show_404()
{
$CI =& get_instance();
$CI->load->view('my_notfound_view');
echo $CI->output->get_output();
exit;
}
}
Grazie per la vostra risposta. prima di tutto ho sentito dire che un reindirizzamento sarebbe una cattiva idea, dal momento che non mostrerebbe il 404 sulla pagina corretta (invece tutti gli 404 sarebbero mostrati come accadendo nell'esempio.it/404) che dovrebbe essere una cattiva idea. Mentre scrivi, quello che voglio veramente è poter caricare viste all'interno dell'errore 404 per includere la mia navigazione, intestazione e piè di pagina. La modifica SO del modello 404 sarebbe un'opzione, se potessi usare le viste. Ho provato get_instance senza fortuna, ho trovato un post su questo blog ma non mi ha aiutato (era del 2008). –
Grazie mille. Con quel piccolo frammento di codice mi ha aiutato molto. Ho persino provato a caricare il controller che ho creato per mostrare il mio 404, ma sembra che $ CI-> load-> non supporti i controller. (Quello che sto usando per 404_override). Ma questo ha reso la mia giornata :) –
Forse refactoring il tuo controller 404_override per chiamare semplicemente show_404(), e avere la funzione show_404() caricare tutti i dati necessari. Keep it DRY man ...;) – landons