php - personalizado - Cómo configurar una página 404 en Phalcon
paginas de error personalizadas xampp (4)
La solución propuesta por Dimopoulos no funciona. Genera una condición de ciclismo.
El componente Phalcon Router tiene un comportamiento predeterminado que proporciona un enrutamiento muy simple que siempre espera un URI que coincida con el siguiente patrón: /: controller /: action /: params. Esto causará muchos problemas porque Phalcon buscará un controlador que no existe cuando el servidor recibe una solicitud de una URL que no coincide con ninguna ruta definida.
Por lo tanto, en primer lugar, debe deshabilitar este comportamiento. Esto se puede hacer pasando FALSE
durante la creación de la instancia de Router, de la siguiente manera:
$router = Phalcon/Mvc/Router(FALSE);
En este punto, puede utilizar la solución propuesta por @ Nguyễn Trọng Bằng.
$router->notFound(
[
"namespace" => "MyNamespace/Controller"
"controller" => "index",
"action" => "route404"
]
);
Es importante tener en cuenta que, si está utilizando un espacio de nombres, el despachador no podrá encontrar el controlador, a menos que lo especifique, como lo hice anteriormente.
Esta no es solo la solución más fácil, sino la única que funciona.
¿Cómo puedo configurar una página 404 en Phalcon para que se muestre cuando no existe un controlador / acción?
Puede configurar el despachador para que lo haga por usted.
Cuando inicia su aplicación, puede hacer esto ( $di
es su fábrica DI):
use /Phalcon/Mvc/Dispatcher as PhDispatcher;
$di->set(
''dispatcher'',
function() use ($di) {
$evManager = $di->getShared(''eventsManager'');
$evManager->attach(
"dispatch:beforeException",
function($event, $dispatcher, $exception)
{
switch ($exception->getCode()) {
case PhDispatcher::EXCEPTION_HANDLER_NOT_FOUND:
case PhDispatcher::EXCEPTION_ACTION_NOT_FOUND:
$dispatcher->forward(
array(
''controller'' => ''error'',
''action'' => ''show404'',
)
);
return false;
}
}
);
$dispatcher = new PhDispatcher();
$dispatcher->setEventsManager($evManager);
return $dispatcher;
},
true
);
Crear un ErrorController
<?php
/**
* ErrorController
*/
class ErrorController extends /Phalcon/Mvc/Controller
{
public function show404Action()
{
$this->response->setStatusCode(404, ''Not Found'');
$this->view->pick(''404/404'');
}
}
y una vista 404 ( /views/404/404.volt
)
<div align="center" id="fourohfour">
<div class="sub-content">
<strong>ERROR 404</strong>
<br />
<br />
You have tried to access a page which does not exist or has been moved.
<br />
<br />
Please click the links at the top navigation bar to
navigate to other parts of the site, or
if you wish to contact us, there is information in the About page.
<br />
<br />
[ERROR]
</div>
</div>
Puede usar enrutamiento para manejar la página 404 no encontrada:
$router->notFound(array(
"controller" => "index",
"action" => "route404"
));
Ref: http://docs.phalconphp.com/en/latest/reference/routing.html#not-found-paths
También puede establecer el encabezado en un errorController utilizando
class ErrorController extends ControllerBase
{
public function error404Action()
{
$this->response->setHeader(''HTTP/1.0 404'',''Not Found'');
// $this->response->setHeader(404, ''Not Found''); <- did not work
}
}
Y antes, en el controlador, donde ocurre un error, puede reenviarlo a este controlador de error.
class IndexController extends ControllerBase
{
public function indexAction()
{
$id = (int)$this->getId($param);
if ($id > 0) {
// do you stuff
} else {
$this->dispatcher->forward(array(
''controller'' => ''error'', ''action'' => ''error404'')
);
}
}
}
Esa es una forma rápida y sucia (?) Y es buena, si obtiene contenido de una base de datos y desea lanzar un error, si no se encuentra nada.