Создание персонализированного page404controller symfony 2.8


Несколько дней я искал способ создать персонализированный контроллер page404 с Symfony 2.8, однако я не нашел никакой помощи по этому поводу. Единственная информация, которую мне удалось получить, находится в KnpUniversity: пример KnpUniversity
Однако поскольку пример неполный, я вообще не понимаю, что делать. У меня уже есть персонализированная версия error404.html.twig. Если у вас есть какой-либо базовый шаблон для этого контроллера и некоторые пояснения по этому поводу, я был бы очень признателен.
За любую дополнительную информацию, не стесняйтесь. Поскольку я новичок, я мало что понимаю в создании контроллера ошибок.


Да, я уже прочитал эту документацию по symfony, но это не так. Помоги мне.



Вот пример URL-адреса, который мне нужно проверить: my.website.com/en/hotel/england/london/palacio

Правильный en/{hotel|villa}/england/london/palacio как URL-адрес, но страница не существует, поэтому я показываю кнопку, с которой я могу перенаправить на:
my.website.com/en/hotel/england/london/ но в случае, когда URL-адрес не соответствует fr или en и отелю или вилле, просто покажите кнопка перехода на главную страницу.
Состав моего URL сделан из базы данных. Итак, я хочу проверить каждую часть таблицы базы данных, соответствующую 3 последним элементам моего URL-адреса. первые два проще, как показано в примере ниже.

Ошибка404Контроллер

<?php

namespace FrontendBundle\Controller;



class Error404Controller extends Controller
 {
/*
 * @Route(
 *        "/{_locale}/{_type}/{$countryName}/{$cityName}/{$etablishementName}",
 *        requirements={
 *        "_locale": "en|fr",
 *        "_type": "hotels|villas|restaurants"
 *        }
 *      )
 */
public function showExceptionAction($countryName,$cityName,$etablishementName)
{
    $em = $this->getDoctrine()->getManager();
    $events = $em->getRepository('FrontendBundle:Error404')
                 ->getUpcomingEvents();
    //$urlreçu = $request->getUri();
    //$urlredirect =0;
    /*
     * 1)Pays
     * 2)Ville
     * 3)Etablissment
     * Si le Pays existe vérifier la Ville sinon retourner un bouton de redirection sur la home
     * Si la Ville existe vérifier le l'établissement sinon retourner boutons de redirection sur la home et la recherche le pays
     * Si l'établissement existe retourner les bouton home et recherche avec pays,ville,etablisee sinon retourner bouton home/recherche avec 1,2
     *
     * */
    $country = $this->getDoctrine()->getRepository(FrontendBundle::Error404)->findCountryCityByName($countryName);
    $city = $this->getDoctrine()->getRepository(FrontendBundle::Error404)->findCountryCityByName($cityName);
    $etablishement = $this->getDoctrine()->getRepository(FrontendBundle::Error404)->findEtablishementBySlug($etablishementName);

    return $this->render('app/Resources/TwigBundle/views/Exception/error404.html.twig', array(
        'redirection' => $events,
        ));
   }
  }

Ошибка 404 Репозиторий

<?php

namespace FrontendBundle\Entity\Repository;


use Doctrine\ORM\EntityRepository;
use SG\FrameworkBundle\Model\CrudEntityInterface;


class Error404Repository extends EntityRepository
{
/*
 * Recherche dans sg_content_translation
 */
public function findCountryCityBySlug($slug)
{
    $qb = $this->createQueryBuilder()
               ->select('world.published_slug')
               ->from('super_table','world')
               ->where('world.published_slug= ?1')
               ->setParameter(1,$slug);


    return $qb->getQuery()->getOneOrNullResult();
}

public function findEtablishementBySlug($slug){
    $qb = $this->createQueryBuilder()
               ->select('world.published_slug')
               ->from('my_table','world')
               ->where('world.published_slug= ?1')
               ->setParameter(1,$slug);
    return $qb->getQuery()->getOneOrNullResult();
 }
 }

Вот мой config.yml, если я правильно понял переопределение

twig:
   exception_controller: FrontendBundle:Error404:showExceptionAction

И это в мой service.yml

services:
   # twig.controller.exception:
   # class: %twig.controller.exception.class%
   # arguments: ["@twig", "%kernel.debug%", "@doctrine"]
     app.exception_controller:
      class: FrontendBundle\Controller\Error404Controller
      arguments: ['@twig','%kernel.debug%']


Я не могу заменить контроллер исключений по умолчанию или я где-то ошибаюсь. Может ли кто-нибудь дать мне представление об этом?
Я получаю: ** Контроллер "FrontendBundle:Error404:showExceptionAction" для URI "/en/villas/france/bernadette" не вызывается. ** и решение, которое я нашел в Интернете, не предназначено для ExceptionController.
Спасибо за помощь :)


person Shinigani    schedule 26.09.2017    source источник
comment
Вы пытаетесь вызвать ошибку 404 в своем действии?   -  person Sylvain Martin Saint Léon    schedule 26.09.2017
comment
Вы также должны установить код ответа 404: Response::HTTP_NOT_FOUND   -  person COil    schedule 27.09.2017
comment
Я пишу это здесь снова: Symfony — действительно достойный фреймворк. НЕ ИСПОЛЬЗУЙТЕ контроллер 404, ИСПОЛЬЗУЙТЕ контроллер, который вызывается по маршруту: /en/villas/france/bernadette, и обрабатывайте ответ в этом контроллере. Это обычный вариант использования фреймворка MVC, ничего особенного. Если вилла существует: отобразите, если нет перенаправления, если перенаправление не существует, 404. Ne pas рычаг une 404 si на affiche du contenu, перенаправление по сравнению с адекватным маршрутом. Порт логического контроллера: il fait les verifications et rend une page en fonction, c'est son role pas besoin d'un controller 404.   -  person Sylvain Martin Saint Léon    schedule 03.10.2017
comment
Le soucis c'est que je souhaite faire uniquement cela sur mes pages 404, car cela ne doit прибытия que dans le cas où je suis sur une page 404. C'est pour cela que je force autant ›‹ . Le suivis c'est : Erreur 404 =›404Controller =› сравнение с BDD =› en foction de afficher les deux bouton sur ma 404.   -  person Shinigani    schedule 03.10.2017
comment
Если вы все еще хотите получить ответ, включите свой адрес электронной почты в своем профиле, и я свяжусь с вами напрямую. Искренне   -  person Sylvain Martin Saint Léon    schedule 28.11.2017
comment
Нашел ответ, опубликую его позже, но спасибо, Сильвен: D   -  person Shinigani    schedule 13.12.2017


Ответы (1)


Если я правильно понимаю ваш запрос: В любом контроллере:

throw $this->createNotFoundException('error message');

Достаточно для запуска рендеринга 404.

Изменить: на основе вашего комментария: если запускается ошибка 404, это означает, что запрошенная страница не существует. Вы также можете вызвать ошибку 404 в контроллере, как объяснялось ранее.

Но если вы хотите отобразить конкретный 404 в зависимости от запрошенного URL-адреса, вы должны использовать прослушиватель событий: Документация прослушивателя событий Symfony, но это немного серьезнее, чем базовый 404, и немного надумано для простого 404.

РЕДАКТИРОВАТЬ 2 НА ОСНОВЕ добавленной информации: я не думаю, что вам следует использовать 404 или переопределять. Это базовая функция Symfony.

В вашем обычном контроллере:

if (database_check) {
     return $this->render(....);
}

if (otherUrlExists()) {
    return new RedirectResponse($this->generateUrl('etablissement_in_city', array('lang' => $lang ...)));
} else {
            return new RedirectResponse($this->generateUrl('homepage'));
}
person Sylvain Martin Saint Léon    schedule 26.09.2017
comment
Я попробую, как ты сказал. Что я хочу сделать, так это получить URL-адрес, который был написан при появлении страницы 404, затем сравнить часть информации, которая была отправлена ​​через нее, с моей базой данных, а затем, если информация верна, отправить ее на кнопку, чтобы перенаправить или отобразить другой кнопку в случае, если URL-адрес не содержит достаточно правой части. - person Shinigani; 26.09.2017
comment
Измените мой ответ в соответствии с вашим комментарием - person Sylvain Martin Saint Léon; 26.09.2017
comment
Можете привести пример URL? - person COil; 27.09.2017
comment
Я добавил больше информации в основной текст. Мне нужно сделать это, потому что на моем веб-сайте много страниц, которые приходят и уходят, поскольку у меня есть некоторые учреждения, которые переключаются с опубликованного на автономный, и поэтому из-за этого у меня также есть ошибка 404. Вот почему мне это нужно. В: Нужно ли расширять контроллер Error404 с помощью Exceptioncontroller? - person Shinigani; 27.09.2017
comment
Я не понимаю, как это сделать на обычном контроллере, когда он должен проходить через ExceptionController. Извините, я пытаюсь понять логику этого. - person Shinigani; 27.09.2017
comment
У вас есть HTTP-запрос, интерпретируемый маршрутизатором. Это маршрут к контроллеру путем вызова определенного действия: В ЭТОМ действии в вашем обычном контроллере вы проверяете, существуют ли ваши записи или доступны ли они в БД, верно? затем в зависимости от ответа вы перенаправляете пользователя или отображаете нужную страницу - person Sylvain Martin Saint Léon; 27.09.2017
comment
Что ж, я попытаюсь понять, что вы имеете в виду, однако пока я не закрою тему, пока не закончу и не опубликую решение. Спасибо за терпеливость. PS: Что-то вроде этого: symfony.com/doc/current/routing.html - person Shinigani; 28.09.2017
comment
Я обновил свою статью, пока я не могу использовать свой контроллер. Даже если бы я сделал все, что написано в документации symfony. - person Shinigani; 02.10.2017