route create php symfony

php - create - symfony controller redirect to route



Symfony2: ¿Redirigir a la última ruta y mostrar un mensaje? (8)

Acabo de configurar una aplicación simple, y parece funcionar bien. Mi createAction () se ve así:

public function createAction() { $entity = new Pokemon(); $request = $this->getRequest(); $form = $this->createForm(new PokemonType(), $entity); $form->bindRequest($request); if ($entity->getName() == "pikachu") { $this->container->get("session")->setFlash("error", "Pikachu is not allowed"); $url = $this->getRequest()->headers->get("referer"); return new RedirectResponse($url); } if ($form->isValid()) { $em = $this->getDoctrine()->getEntityManager(); $em->persist($entity); $em->flush(); return $this->redirect($this->generateUrl(''pokemon_show'', array(''id'' => $entity->getId()))); } return $this->render(''BulbasaurBundle:Pokemon:new.html.twig'', array( ''entity'' => $entity, ''form'' => $form->createView() )); }

El flujo va:

  • El usuario navega a / nuevo
  • El usuario ingresa la opción inválida de "pikachu"
  • El usuario hace clic en enviar (POSTs a / crear)
  • La aplicación rechaza la entrada, agrega un mensaje flash y redirige a / nuevo
  • El usuario ve / nuevo con el mensaje flash

Algunas cosas para verificar:

  • ¿Está realmente funcionando su ruta para /demo/{entityId}/edit ? (es decir, si lo ingresa en el navegador, ¿realmente va a donde lo espera?)

  • ¿Estás encadenando diferentes redirecciones / reenvíos? Me di cuenta de que tengo un comportamiento inesperado (pero correcto) cuando tengo un controlador que redirige a una URL, y el controlador responsable de esa URL también redirige a otro lugar. He solucionado este problema mediante el uso de reenvío en su lugar.

Dicho eso, si todo lo demás falla, podría usar el método redirect () del controlador para administrar la redirección:

public function createAction() { ... return $this->redirect($this->generateUrl("pokemon_new")); ... }

Tengo un pequeño problema al intentar mostrar un mensaje y redireccionar al usuario a la página anterior en Symfony 2 .

Tengo un CRUD muy simple. Cuando sea nuevo o edite, quiero mostrar un mensaje si algo falla en los respectivos métodos de creación / actualización:

  1. User --GET--> new
  2. new --POST--> create (fails)
  3. --REDIRECT--> new (with flash message)

Estoy haciendo lo siguiente:

$this->container->get(''session'')->setFlash(''error'', ''myerror''); $referer = $this->getRequest()->headers->get(''referer''); return new RedirectResponse($referer);

Sin embargo, ¡no está redirigiendo a la referencia correcta! Aunque el valor de referencia es correcto (por ej . http://localhost/demo/2/edit/ ) Redirige al índice. ¿Por qué?


Aquí tienes, declara esto como un servicio y te lo devolverá donde y cuando lo necesites. Sin rasgos, sin dependencias extrañas.

class Referer { /** @var RequestStack */ private $requestStack; /** @var RouterInterface */ private $router; public function __construct(RequestStack $requestStack, RouterInterface $router) { $this->requestStack = $requestStack; $this->router = $router; } public function getReferer() : string { $request = $this->requestStack->getMasterRequest(); if (null === $request) { return ''''; } //if you''re happy with URI (and most times you are), just return it $uri = (string)$request->headers->get(''referer''); //but if you want to return route, here you go try { $routeMatch = $this->router->match($uri); } catch (ResourceNotFoundException $e) { return ''''; } $route = $routeMatch[''_route'']; return $route; } }


El mensaje de Naitsirch presentado en la siguiente url: https://github.com/symfony/symfony/issues/2951

Parece una buena solución para lo que necesita:

public function getRefererRoute() { $request = $this->getRequest(); //look for the referer route $referer = $request->headers->get(''referer''); $lastPath = substr($referer, strpos($referer, $request->getBaseUrl())); $lastPath = str_replace($request->getBaseUrl(), '''', $lastPath); $matcher = $this->get(''router'')->getMatcher(); $parameters = $matcher->match($lastPath); $route = $parameters[''_route'']; return $route; }

Luego con una redirección:

public function yourFunctionAction() { $ruta = $this->getRefererRoute(); $locale = $request->get(''_locale''); $url = $this->get(''router'')->generate($ruta, array(''_locale'' => $locale)); $this->getRequest()->getSession()->setFlash(''notice'', "your_message"); return $this->redirect($url); }


Esta es una versión alternativa de Naitsirch y Santi su código. Me di cuenta de que un rasgo sería perfecto para esta funcionalidad. También optimizó el código de alguna manera. Preferí devolver todos los parámetros, incluidas las babosas, porque podría necesitarlos al generar la ruta.

Este código se ejecuta en PHP 5.4.0 y superiores. Puede usar el rasgo para múltiples controladores, por supuesto. Si coloca el rasgo en un archivo separado, asegúrese de nombrarlo igual que el rasgo, siguiendo a PSR-0.

<?php trait Referer { private function getRefererParams() { $request = $this->getRequest(); $referer = $request->headers->get(''referer''); $baseUrl = $request->getBaseUrl(); $lastPath = substr($referer, strpos($referer, $baseUrl) + strlen($baseUrl)); return $this->get(''router'')->getMatcher()->match($lastPath); } } class MyController extends Controller { use Referer; public function MyAction() { $params = $this->getRefererParams(); return $this->redirect($this->generateUrl( $params[''_route''], [ ''slug'' => $params[''slug''] ] )); } }


Esto funciona para mí:

$this->redirect($request->server->get(''HTTP_REFERER''));


Para Symfony 3.0, mensaje flash con redirección a la página anterior, esto se puede hacer en el controlador.

$request->getSession() ->getFlashBag() ->add(''notice'', ''success''); $referer = $request->headers->get(''referer''); return $this->redirect($referer);


Tengo una funcionalidad similar en mi sitio. Es multilingüe Los artículos existen solo en una configuración regional única. Cuando el usuario intente cambiar a otra configuración regional, debe redireccionar a la página anterior y mostrar el mensaje de que esa página / artículo no existe en la configuración regional solicitada.

/en/article/3 -> /fr/article/3 (404) -> Redirect(/en/article/3)

Aquí está mi versión del script que funciona bien en entornos dev y prod :

$referer = $request->headers->get(''referer'') // ''https://your-domain.com'' or ''https://your-domain.com/app_dev.php'' $base = $request->getSchemeAndHttpHost() . $request->getBaseUrl(); // ''/en/article/3'' $path = preg_replace(''/^''. preg_quote($base, ''/'') .''/'', '''', $referer); if ($path === $referer) { // nothing was replaced. referer is an external site } elseif ($path === $request->getPathInfo()) { // current page and referer are the same (prevent redirect loop) } else { try { // if this will throw an exception then the route doesn''t exist $this->container->get(''router'')->match( // ''/en/hello?foo=bar'' -> ''/en/hello'' preg_replace(''//?.*$/'', '''', $path) ); // ''/app_dev.php'' . ''/en/article/3'' $redirectUrl = $request->getBaseUrl() . $path; return new RedirectResponse($redirectUrl); } catch (/Symfony/Component/Routing/Exception/ResourceNotFoundException $e) {} }


parece que necesita tener una carga útil para que su redireccionamiento apunte. me parece un código de concepto oscuro. También le aconsejo que se asegure de que sus archivos de configuración apunten al fragmento de código de redireccionamiento correcto. Verifique el archivo de acceso del servidor para asegurarse de que también tenga habilitados los redireccionamientos.