Implementing a custom 500 error page for exceptions in Symfony 1.4

Implementing a custom 500 error page for exceptions in Symfony 1.4

"Oops, an error ocurred", memorable message of exceptions shown in Symfony 1.4 based projects when they're specifically on the production environment. The default error page of Symfony is pretty informative to the user, it basically says that what they were trying to do couldn't be achieved for "x" reason. 

Normally, you don't want to show the reason of the exception to the user, you only want to notice him that something is failing, however is pretty important to show an error page that is related to the design of your entire project, that's why in Symfony 1.4 is possible to override the default 500 error page by a custom one. In this article, we'll show you how to override it by simply creating a new file in a specific directory of your project.

Creating custom 500 error page

To customize the 500 error page used by symfony in the production environment, you will need to create a new directory named error inside the /config folder of your entire app or per sub-app level e.g yourproject/config (for a non sub app specific error page) or if you have sub applications yourproject/apps/<my-app>/config. Inside this directory, you only need to create an empty PHP file with the name error.html.php. For example, in our project we have 2 sub applications, however we want a single error page for both of them, so we'll place the error template in the config/error directory of the project:

Symfony 1.4 custom error page

As next, you only need to write your HTMl template in the error.html.php, note that you will be able as well to do PHP stuff related to Symfony 1.4 as well. For example, using an open source 500 error page, the content of our error.html.php template could be something like:

<?php // yourproject/config/error/error.html.php ?>
<!DOCTYPE html>
<html lang="en">
    <head>
        <!-- Simple HttpErrorPages | MIT License | https://github.com/AndiDittrich/HttpErrorPages -->
        <meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1" />
        <title>We've got some trouble | 500 - Webservice currently unavailable</title>
        <style type="text/css">/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}/*! Simple HttpErrorPages | MIT X11 License | https://github.com/AndiDittrich/HttpErrorPages */body,html{width:100%;height:100%;background-color:#21232a}body{color:#fff;text-align:center;text-shadow:0 2px 4px rgba(0,0,0,.5);padding:0;min-height:100%;-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,.8);box-shadow:inset 0 0 100px rgba(0,0,0,.8);display:table;font-family:"Open Sans",Arial,sans-serif}h1{font-family:inherit;font-weight:500;line-height:1.1;color:inherit;font-size:36px}h1 small{font-size:68%;font-weight:400;line-height:1;color:#777}a{text-decoration:none;color:#fff;font-size:inherit;border-bottom:dotted 1px #707070}.lead{color:silver;font-size:21px;line-height:1.4}.cover{display:table-cell;vertical-align:middle;padding:0 20px}footer{position:fixed;width:100%;height:40px;left:0;bottom:0;color:#a0a0a0;font-size:14px}</style>
    </head>
    <body>
        <div class="cover">
            <h1>Webservice currently unavailable <small>Error 500</small></h1>
            <p class="lead">An unexpected condition was encountered. 
                <br />Our service team has been dispatched to bring it back online.
            </p>
        </div>
    </body>
</html>

Finally, clear the cache of your symfony project using:

php symfony cc

And everytime an exception is thrown in the production environment, you will see the custom error page:

Note

Don't forget that to test the page, you will need to be in the prod environment (without frontend_dev.php), not dev environment. Otherwise you will see always the stack trace of Symfony.

Custom Error Page Symfony 1.4

Happy coding !

Become a more social person