Redirigir es más limpio; cargar una vista también podría funcionar.
El problema aquí es que show_404() se suele llamar DESPUÉS de que su controlador ya se haya cargado (algo tenía que indicarle que mostrara el 404 después de todo). A CI no le gusta cargar un segundo controlador en ese punto, que es el obstáculo principal.
Su mejor opción probablemente sea extender la función show_404() en la clase de excepciones para redireccionar a su ruta 404. Sin una redirección, tendrá que mostrar una vista o algo que sepa que tiene todos los "datos adicionales" que necesita antes de llamar al 404 (o supongo que también podría cargarlo en la clase de Excepciones). Puede ser realmente complicado en algunas vistas dinámicas.
Obviamente, usted desea algo más avanzado que simplemente editar la plantilla 404 en la carpeta de errores. He tenido problemas al intentar acceder a get_instance() desde ese archivo, ya que a veces se carga antes de que se construya el controlador. Por lo tanto, tenga cuidado si se intenta que;)
Actualización: Aquí está un ejemplo de trabajo de extender la función show_404() para cargar 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;
}
}
Gracias por su respuesta. En primer lugar, escuché que una redirección sería una mala idea, ya que no mostraría el 404 en la página correcta (en cambio, se mostraría que todos los 404 están sucediendo en el ejemplo).com/404) que debería ser una mala idea. Al escribir, lo que realmente quiero es poder cargar vistas dentro del error 404 para incluir mi navegación, encabezado y pie de página. ASÍ QUE editar la plantilla 404 sería una opción, si pudiera usar vistas. Probé get_instance sin suerte, encontré una publicación de blog pero no me ayudó (era de 2008). –
Muchas gracias. Con ese pequeño fragmento de código me ayudó mucho. Incluso intenté cargar el controlador que hice para mostrar mi 404, pero parece que $ CI-> load-> no es compatible con los controladores. (El que estoy usando para 404_override). Pero esto acaba de hacer que mi día :) –
Tal vez refactorice su controlador 404_override simplemente llame a show_404(), y haga que la función show_404() cargue todos los datos que necesita. Keep it DRY man ...;) – landons