no-framework-tutorial/03-error-handler.md
2022-05-31 18:50:35 +02:00

3.1 KiB

<< previous | next >>

Error Handler

An error handler allows you to customize what happens if your code results in an error.

A nice error page with a lot of information for debugging goes a long way during development. So the first package for your application will take care of that.

I like filp/whoops, so I will show how you can install that package for your project. If you prefer another package, feel free to install that one. This is the beauty of programming without a framework, you have total control over your project.

An alternative package would be: PHP-Error

To install a new package, open up your composer.json and add the package to the require part. It should now look like this:

"require": {
    "php": ">=8.1.0",
    "filp/whoops": "^2.14"
},

Now run composer update in your console, and it will be installed.

Another way to install packages is to simply type "composer require filp/whoops" into your terminal at the project root, i that case composer automatically installs the package and updates your composer.json-file.

But you can't use it yet. PHP won't know where to find the files for the classes. For this you will need an autoloader, ideally a PSR-4 autoloader. Composer already takes care of this for you, so you only have to add a require __DIR__ . '/../vendor/autoload.php'; to your Bootstrap.php.

Important: Never show any errors in your production environment. A stack trace or even just a simple error message can help someone to gain access to your system. Always show a user-friendly error page instead and send an email to yourself, write to a log or something similar. So only you can see the errors in the production environment.

For development that does not make sense though -- you want a nice error page. The solution is to have an environment switch in your code. We use the getenv() function here to check the environment and define the 'dev' env as standard in case no environment has been set.

Then after the error handler registration, throw an Exception to test if everything is working correctly. Your Bootstrap.php should now look similar to this:

<?php declare(strict_types=1);

namespace Lubian\NoFramework;

use Whoops\Handler\PrettyPageHandler;
use Whoops\Run;

require __DIR__ . '/../vendor/autoload.php';

$environment = getenv('ENVIRONMENT') ?: 'dev';

error_reporting(E_ALL);

$whoops = new Run;
if ($environment === 'dev') {
    $whoops->pushHandler(new PrettyPageHandler);
} else {
    $whoops->pushHandler(function (\Throwable $e) {
        error_log("Error: " . $e->getMessage(), $e->getCode());
        echo 'An Error happened';
    });
}
$whoops->register();

throw new \Exception("Ooooopsie");

You should now see a error page with the line highlighted where you throw the exception. If not, go back and debug until you get it working. Now would also be a good time for another commit.

<< previous | next >>