Ответ 1
Symfony\Component\Routing\Exception\ResourceNotFoundException
означает undefined имя маршрута. Похоже, что у вас есть где-то в вашем шаблоне ошибок {{ path('wrong_route') }}
.
В моем проекте Symfony2 я получаю в режиме разработки корректный экран 404 Exception. Но я получаю пустой экран с кодом статуса HTTP 500 вместо 404 в режиме производства. Я использую собственные шаблоны ошибок, расположенные в app/Resources/TwigBundle/views/Exception
. В журнале ошибок apache он создает это сообщение:
PHP Fatal error: Uncaught exception 'Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException' in /home/test/app/cache/prod/appprodUrlMatcher.php:518\nStack trace:
#0 /home/test/app/cache/prod/classes.php(1025): appprodUrlMatcher->match('/404')
#1 /home/test/app/cache/prod/classes.php(4550): Symfony\\Component\\Routing\\Router->match('/404')
#2 [internal function]: Symfony\\Bundle\\FrameworkBundle\\EventListener\\RouterListener->onKernelRequest(Object(Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent))
#3 /home/test/app/cache/prod/classes.php(3777): call_user_func(Array, Object(Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent))
#4 /home/test/app/cache/prod/classes.php(3703): Symfony\\Component\\EventDispatcher\\EventDispatcher->doDispatch(Array, 'kernel.request', Object(Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent))
#5 /home/test/app/cache/prod/classes.php(4787): Symfony\\Component\\EventDispatcher\\EventDispatcher->dispatch('kernel.request', Object(Symfony\\Component\\HttpKernel\\Event\\Get in /home/test/app/cache/prod/classes.php on line 4560
Symfony\Component\Routing\Exception\ResourceNotFoundException
означает undefined имя маршрута. Похоже, что у вас есть где-то в вашем шаблоне ошибок {{ path('wrong_route') }}
.
Наиболее вероятная причина, по которой вы получаете 500 ошибок/пустую страницу при производстве (app.php), даже если вы определили страницу пользовательских ошибок (например, приложение /Resources/TwigBundle/views/Exception/error 404.html.twig) заключается в том, что ваш шаблон ошибки вызывает функцию is_granted twig, не проверяя, зарегистрирован ли пользователь.
Шаги для отладки:
1) Проверьте приложение/журналы/prod.log. Вы видите такую ошибку?
request.ERROR: Exception thrown when handling an exception (Twig_Error_Runtime: An exception has been thrown during the rendering of a template ("The security context contains no authentication token. One possible reason may be that there is no firewall configured for this URL.")
2) Если вы видите ошибку, упомянутую выше, посмотрите, можете ли вы найти ссылку на is_granted в своем шаблоне ошибок. Убедитесь, что пользователь вошел в систему перед вызовом is_granted. Например:.
{% if app.user is not null and is_granted('ROLE_ADMIN') %}
<p>Text goes here</p>
{% else %}
3) Если вы не можете найти ссылку на is_granted в своем шаблоне, посмотрите, есть ли вызов knp_menu_render(), который используется в комплекте KNP. Также проверьте любой расширенный шаблон. Завершите вызов knp_menu_render в чеке, чтобы проверить, что пользователь вошел в систему:
{% if app.user %}
{{ knp_menu_render() }}
{% endif %}
Для получения дополнительной информации, просмотрите комментарий по stof в конце этой страницы: https://github.com/symfony/symfony/issues/5320
ResourceNotFoundException
- это то, что маршрутизатор бросает, когда маршрут не соответствует текущему запросу.
Это может быть проблема с кешем (80% времени, это кеш. Попробуйте rm -rf app/cache/*
на вашем предварительном сервере). Поскольку проблема не появляется локально... (, вы пытались локально "prod" env?).
Вы также должны попытаться удалить все из вашего app/Resources/TwigBundle/views/Exception/error404.html.twig
(это имя файла, которое вы используете?), за исключением простого HTML, чтобы проверить, не проблема ли это.
В моем случае это было использование тега {% stylesheets%} в шаблоне 404, в то время как TwigBundle не был включен в конфигурацию Assetic.
Проверьте app/logs/prod.log
, у него должен быть ответ.
У меня была такая же проблема,
Но мой isGranted
был на стороне php. Поэтому я добавил проверку маркера:
До:
if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')
После:
if ($this->get('security.token_storage')->getToken() && $this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')
Другим вариантом является то, что вы пытаетесь получить доступ к токену безопасности в контексте безопасности, когда нет токена.
Вот как я перенаправляю все несуществующие маршруты на корневой путь. Поместите эту запись маршрута в самую нижнюю часть конфигурации маршрутизации. Весь существующий маршрут ДОЛЖЕН быть на вершине!
anything:
path: /{path}
defaults:
_controller: FrameworkBundle:Redirect:urlRedirect
path: /
permanent: true
requirements:
path: ".+"
ссылка:
http://symfony.com/doc/current/cookbook/routing/slash_in_parameter.html
http://symfony.com/doc/current/cookbook/routing/redirect_in_config.html
возможно app/Resources/TwigBundle/views/Exception/error.html.twig ссылается на другой шаблон макета-макета, который не существует - это была проблема в моем случае
В моем случае (symfony 2.3) я получал код состояния 200, поэтому страницы с ошибкой не загружались. Вот как я это решил:
https://groups.google.com/d/msg/Symfony2/zNWNmQIq3nk/lVs4uC7QMIcJ
Просто дополнительная заметка к данным ответам: ResourceNotFoundException
также может быть брошен, если вы пытаетесь включить несуществующий шаблон. Типичным случаем является то, что вы реорганизовали свой код приложения, но вы забыли обновить свои страницы ошибок, поскольку они находятся в app/Resources
, а не в вашей папке src/
или в том числе заданный шаблон, в котором используется переменная или служба, которая не определена в контексте "ошибки".
Я сталкиваюсь с тем, что Symofny 3 выдает 500 ошибок в производстве, когда вы не используете
$this->createNotFoundException()
в вашем контроллере.
throw Exception('message', 404)
работает на dev-enviroment, но не на производстве.