[Symfony2] Twig werkt niet in 404 pagina

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Koen Vlaswinkel

Koen Vlaswinkel

24/08/2013 16:14:04
Quote Anchor link
Hallo,

Ik gebruik voor mijn website Symfony2 en nu ben ik erachter gekomen dat als ik een pagina open die niet bestaat, deze een 500 error geeft ipv een 404, waarnaast ook nog mijn template niet wordt weergegeven.

Ik heb gedebugd en ben erachter gekomen dat mijn Twig template het niet correct doet. Ik extend '::layout.html.twig', maar dit doet het dus niet. Als ik dit weghaal en alleen HTML laat staan, doet hij het wel. Hoe kan dit?

Het vreemde is ook nog dat er niks in app/logs/prod.log, maar alles als een uncaught exception naar de apache2 error log wordt gelogt, met een "Uncaught exception 'Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException'".

Dit is mijn template die het niet doet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
{% extends '::layout.html.twig' %}
{% block title %}Pagina niet gevonden{% endblock %}
{% block content %}
    <div class="hero-unit">
        <h1>Niet gevonden :(</h1>
        <p>Sorry, maar de pagina die je probeerde te bereiken, is niet gevonden</p>
    </div>
{% endblock %}


En deze doet het wel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
    <div class="hero-unit">
        <h1>Niet gevonden :(</h1>
        <p>Sorry, maar de pagina die je probeerde te bereiken, is niet gevonden</p>
    </div>
 
PHP hulp

PHP hulp

21/12/2024 19:27:40
 
Frank Nietbelangrijk

Frank Nietbelangrijk

24/08/2013 16:38:18
Quote Anchor link
het klinkt alsof bij een 404 niet de frontcontroller doorlopen wordt (app.php of app_dev.php)?

Welke route wordt er afgelegd en hoe ziet je controller er uit?
Gewijzigd op 24/08/2013 16:39:25 door Frank Nietbelangrijk
 
Koen Vlaswinkel

Koen Vlaswinkel

24/08/2013 16:56:03
Quote Anchor link
Dit is op een productie server, dus als front controller wordt app.php gebruikt. Ik heb er niks aan gewijzigd behalve dat hij APC gebruikt. De default controller voor errors is Symfony\Bundle\TwigBundle\Controller\ExceptionController en deze roept het template TwigBundle:Exception:error404.html.twig aan, die ik heb overriden in app/Resources/TwigBundle/views/Exception/error.html.twig.

Ik weet zeker dat ::layout.html.twig bestaat, want die gebruik ik ook in al mijn andere templates.

Dit is de hele stack trace:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
PHP Fatal error:  Uncaught exception 'Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException' in /var/www/beta.hetgoeselyceum.nl/app/cache/prod/appProdUrlMatcher.php:917\nStack trace:\n#0 /var/www/beta.hetgoeselyceum.nl/app/cache/prod/classes.php(1195): appProdUrlMatcher->match('/asdgsdg')\n#1 /var/www/beta.hetgoeselyceum.nl/app/cache/prod/classes.php(1860): Symfony\\Component\\Routing\\Router->match('/asdgsdg')\n#2 [internal function]: Symfony\\Component\\HttpKernel\\EventListener\\RouterListener->onKernelRequest(Object(Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent))\n#3 /var/www/beta.hetgoeselyceum.nl/app/cache/prod/classes.php(1655): call_user_func(Array, Object(Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent))\n#4 /var/www/beta.hetgoeselyceum.nl/app/cache/prod/classes.php(1588): Symfony\\Component\\EventDispatcher\\EventDispatcher->doDispatch(Array, 'kernel.request', Object(Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent))\n#5 /var/www/beta.hetgoeselyceum.nl/app/cache/prod/classes.php(1752): Symfony\\Component\\EventDisp in /var/www/beta.hetgoeselyceum.nl/app/cache/prod/classes.php on line 1871
Gewijzigd op 24/08/2013 16:56:18 door Koen Vlaswinkel
 
Frank Nietbelangrijk

Frank Nietbelangrijk

24/08/2013 17:16:06
Quote Anchor link
heb je de cache geleegd?
 
Koen Vlaswinkel

Koen Vlaswinkel

24/08/2013 17:31:13
Quote Anchor link
Al een paar keer, die leeg ik elke keer nadat ik een aanpassing maak :)
 
Wouter J

Wouter J

24/08/2013 17:49:54
Quote Anchor link
Heb je dit probleem ook in de dev omgeving? Zo ja, dan ben ik wel benieuwt naar de message van de exception.
 
Koen Vlaswinkel

Koen Vlaswinkel

24/08/2013 18:07:41
Quote Anchor link
Nee, als ik de dev omgeving openzet op mijn productieserver, krijg ik de normale 'No route found for "GET /asdgsdg"' message.

Als ik Debug::enable toevoeg in app.php, krijg ik wel een error page. Jullie kunnen hem zelf bekijken op http://beta.hetgoeselyceum.nl/adgsd.
Gewijzigd op 24/08/2013 18:09:50 door Koen Vlaswinkel
 
Frank Nietbelangrijk

Frank Nietbelangrijk

24/08/2013 18:43:16
Quote Anchor link
in welke directory staat layout.html.twig? en moet het niet worden jouwbundle::layout.html.twig?
 
Koen Vlaswinkel

Koen Vlaswinkel

24/08/2013 18:52:06
Quote Anchor link
layout.html.twig staat in app/Resources/views, dus die is bereikbaar via ::layout.html.twig omdat hij geen bundle of controller heeft.
 
Wouter J

Wouter J

24/08/2013 18:55:21
Quote Anchor link
::layout.html.twig verwijst naar het layout.html.twig file in app/Resources/views/layout.html.twig

Het rare vind ik dat er geen exception message is. Gebruik je iets van security in de layout file?
 
Koen Vlaswinkel

Koen Vlaswinkel

24/08/2013 19:00:20
Quote Anchor link
Ja, ik gebruik is_granted om een menu te laten zien die verschillend is voor ingelogde en niet-ingelogde gebruikers.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

24/08/2013 19:06:13
Quote Anchor link
okee daar wordt voor gewaarschuwd om dat niet te gebruiken

http://symfony.com/doc/current/cookbook/controller/error_pages.html

You must not use is_granted in your error pages (or layout used by your error pages), because the router runs before the firewall. If the router throws an exception (for instance, when the route does not match), then using is_granted will throw a further exception. You can use is_granted safely by saying {% if app.user and is_granted('...') %}.
 
Koen Vlaswinkel

Koen Vlaswinkel

24/08/2013 19:11:06
Quote Anchor link
Oke, dan zal ik dat morgen proberen en als het niet werkt zal ik hier wel weer posten.
 
Wouter J

Wouter J

24/08/2013 19:22:39
Quote Anchor link
Ah, dat waarschijnlijk het probleem. Zowel de router als de Authentication doen hun werk tijdens het kernel.request event. Hierbij wordt eerst de router en dan pas de Authentication aangeroepen. Dat betekend dat als de router een exception geeft (omdat hij geen route kan vinden), de Authentication niet meer wordt aangeroepen. Dat betekend dat functies als is_granted niet werkt.

Om dit te voorkomen gebruik je een andere if eromheen. Zie ook http://symfony.com/doc/current/cookbook/controller/error_pages.html :
Quote:
You must not use is_granted in your error pages (or layout used by your error pages), because the router runs before the firewall. If the router throws an exception (for instance, when the route does not match), then using is_granted will throw a further exception. You can use is_granted safely by saying {% if app.user and is_granted('...') %}.


Toevoeging op 24/08/2013 19:45:11:

Sorry frank, ik had niet gezien dat jij al gereageerd had.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

24/08/2013 22:52:06
Quote Anchor link
Geen probleem hoor Wouter, je geeft zoals altijd waardevolle informatie en zeker als het om Symfony gaat.
 
Wouter J

Wouter J

24/08/2013 23:52:09
Quote Anchor link
Merk overigens op dat dit geldt vanaf versie 2.1, in 2.0 werd de Authentication vóór de router uitgevoerd.
 
Koen Vlaswinkel

Koen Vlaswinkel

25/08/2013 13:23:24
Quote Anchor link
Het werkt als ik die app.user toevoeg, maar is het niet raar dat Symfony geen exception geeft zoals 'No security context' ofzo? Dat zou toch veel logischer zijn dan gewoon een exception niet te catchen.

Iets anders logisch kan zijn dat als er een exception optreed in de exception handler dat Symfony dan zelf een exception page geeft?
 
Wouter J

Wouter J

25/08/2013 14:40:06
Quote Anchor link
Nee, dat gebeurd niet in de productie omgeving. Symfony catched alle exceptions in de dev. omgeving en symfony catched ook alle exceptions in de productie omgeving, maar dan worden die gelogd en niet als een pagina gerenderd. Exceptions moet je nooit aan de gebruiker tonen, behalve als je bepaalde user exceptions hebt, maar die moet je dan zelf in een controller of tijdens het kernel.exception event catchen.

En ja, het is vreemd dat je alleen een ResourceNotFound exception krijgt. Het lijkt erop dat symfony alleen de laatste exception logt, en niet alle vorige exception. Het lijkt erop dat dit vroeger wel werkte: https://github.com/symfony/symfony/issues/5320
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.