2016-10-19 3 views
1

Im System (Symfony 2.8) für einige Objekte haben wir "edit this" -Schaltflächen sowohl in der Objektliste als auch auf der "details" -Seite des Objekts. Mein Kunde möchte plötzlich, dass alle Formulare nach dem Senden mit den korrekten Daten an die Stelle weitergeleitet werden, von der er gekommen ist.
Also dachte ich, ich könnte den Ursprung in der Sitzung speichern und dann umleiten, aber ich würde es gerne etwas generischer machen, wie bei jeder Aktion, die es erlauben würde, "Edit" oder "Create" einzugeben oder so tun:Symfony2 - get oder create route arguments array?

$this->get('session')->set(
    'formOrigin', 
    [ 
     'route' => $this->get('request')->get('_route'), 
     'arguments' => ??? 
    ] 
) 

und dann, nachdem Daten aus Form Handhabung Herkunft von Sitzung holen, und wenn nicht null

return $this->redirectToRoute($formOrigin['route'], $formOrigin['arguments']); 

Aber das Problem ist, dass ??? im Code :) können Sie mir einen Tipp geben hier ?

Um zu klären, kann ich Routenargumente als Array "von irgendwo" bekommen, oder muss ich es jedes Mal selbst bauen? Ich kann es bauen, aber es scheint mir, hässlich ...

+0

könnten Sie die [Referer] verwenden umleiten (https://en.wikipedia.org/wiki/HTTP_referer) als '$ request-> headers-> get ('referer')'? – Matteo

Antwort

1

Warum Sie speichern nicht refrer in der Sitzung:

$referer = $request->headers->get('referer'); 
$this->get('session')->set('referer', $referer); 

wenn das Objekt bearbeiten Eingabe und nach erfolgreich es umleiten Vorlage bilden.

Oder Sie können Route params von $request Objekt erhalten:

$routeParams = $request->attributes->get('_route_params'); 
0

Gehen Sie einfach Sie Hörer verwenden:

einen Listener erstellen, die Ihre Anfrage hören und speichern Sie die Route in einer Sitzung

zum Beispiel in Ihrem BundleName/Resources/config/services.yml

services: 
    redirect_listener: 
     class: BundleName\EventListener\RedirectListener 
     arguments: ['@service_container'] 
     tags: 
      - {name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 

bundle/Eventlistener/RedirectListener.php

use Symfony\Component\DependencyInjection\ContainerInterface; 
use Symfony\Component\HttpFoundation\Session\Session; 
use Symfony\Component\HttpKernel\Event\GetResponseEvent; 

class RedirectionListener 
{ 
    protected $session; 

    public function __construct(ContainerInterface $containerInterface) 
    { 
     $this->session = $containerInterface->get('session'); 
    } 

    /** 
    * @param GetResponseEvent $event 
    */ 
    public function onKernelRequest(GetResponseEvent $event) 
    { 
     $route = $event->getRequest()->attributes->get('_route'); 

     if($this->session->has('route')) $this->session->remove('route'); 

     // Add route in session 
     $this->session->add('route', $route); 
    } 



} 

Sie, nach Controller Datenverarbeitung Sie

class YourController extends Controller 
{ 

    public function yourHandleFormAction() 
    { 
     // After handling data 
     $this->redirect($this->get('session')->get('route')); 

    } 
} 
Verwandte Themen