tutorial the sorry query occurred inconvenience has framework for error custom application php error-handling slim

php - the - slim framework tutorial



¿Cómo puedo enviar una página de error en Slim Framework cuando se lanza una excepción fuera de una ruta? (1)

Estoy tratando de entender el orden de las operaciones para lidiar con las excepciones lanzadas en una aplicación de framework delgada y la entrega de la página final. Básicamente, si lanzo una excepción en una clase, me gustaría que Slim entregue mi bonita página de Twig 500, pero ni siquiera puedo hacer que Slim entregue su propia página de error normal cuando se lanza una excepción fuera de una ruta.

Dado este constructor de clase de base de datos:

public function __construct(array $connection, /Slim/Slim $slim) { $this->slim = $slim; try { $this->db = new /PDO(...); $this->db->setAttribute(/PDO::ATTR_EMULATE_PREPARES, FALSE); $this->db->setAttribute(/PDO::ATTR_ERRMODE, /PDO::ERRMODE_EXCEPTION); } catch (/PDOException $e) { // How can I kill further execution here and have Slim deliver a 500? } }

Si ejecuto $this->slim->error(); Recibo un Fatal error: Uncaught exception ''Slim/Exception/Stop'' .

Idealmente, me gustaría hacer algo como:

  1. $this-slim->log->error("Unable to connect to database."); mediante $this-slim->log->error("Unable to connect to database.");
  2. Dejar de intentar ejecutar otras acciones en mi clase de base de datos (que fallaría y lanzaría una excepción fatal)
  3. Entregar la página a través de un archivo de plantilla 500.twig.

Cualquier ayuda o dirección sería muy apreciada.


Te estás enfrentando porque el manejo de errores de Slim no se ha configurado porque tu aplicación nunca llega a /Slim/Slim::run() .

Dos cosas para hacer:

1) Recomiendo agregar su clase de base de datos (y otras clases similares) al contenedor de Inyección de Dependencia de Slim.

$app->container->singleton(''db'', function () use ($app) { return new Database($app); });

Eso permitirá la carga diferida de su conexión a la base de datos. La clase no se creará hasta que la uses. En ese momento, y supongo que aquí, estará en una ruta, se habrá llamado a /Slim/Slim::run() y se implementará el control de error Slim.

2) Ahora que la excepción no va a ocurrir antes de que su aplicación esté completamente configurada, puede usar el registro:

public function __construct(/Slim/Slim $app) { $this->slim = $app; try { $this->db = new /PDO(''sqlite:/does/not/exist''); } catch (/PDOException $p) { $this->slim->log->error(''BAD THINGS''); return $this->slim->error(); } return $this; }

junto con el manejo de errores personalizado de Slim.

$app->error(function(/Exception $e) use ($app) { if ($e instanceof /PDOException) { return $app->render(''500.twig'', array(), 500); } });