Ich gehe zu diesem Forum, weil ich keine gültige Lösung für mein Problem finden kann.Symfony2: dynamischer Routing-Parameter
Ich habe die Verwaltung einer Symfony2-Anwendung übernommen, die Aufträge, Rechnungen ... innerhalb eines Unternehmens verarbeitet und das Problem ist, dass es keine Archivierungsfunktionen darauf gibt. Also bat mich der Manager, der Anwendung die Funktionalität "Jahr für Jahr" hinzuzufügen (einfach die Daten je nach gewähltem Jahr anzuzeigen).
Also habe ich beschlossen, alle Anwendungsrouten um/{Jahr} /, Präfix, der das Jahr, den der Manager sehen will, und alle Dokumente sind datiert, ich muss nur Doctrine Anfragen für die Auswahl diese zu aktualisieren die dem gewählten Jahr entsprechen. Bis jetzt keine Probleme.
routes.yml
mes_routes:
resource: "mes_routes.yml"
prefix: /{year}
defaults: {'year': %current_year%}
Damit habe ich eine Symfony-Erweiterung erstellt, die die 'CURRENT_YEAR' var standardmäßig in meiner Route Definition füllt, mit dem aktuellen Jahr, wenn kein Jahr vorgesehen ist.
MyAppExtension.php
class MyAppExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);
$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.yml');
// Fill parameter with the current year
$container->setParameter('current_year', date("Y"));
}
}
Als nächstes habe ich eine RouteListener geschaffen, die eine vorherige Route und seine Parameter in einer Sitzung var speichert, wenn ein Benutzer zeigt eine neue Seite (um eine gleiche anzuzeigen Seite aber mit einem anderen Jahr next)
LastRouteListener.php
class LastRouteListener
{
public function onKernelRequest(GetResponseEvent $event)
{
// Don't store subrequests
if ($event->getRequestType() !== HttpKernel::MASTER_REQUEST) {
return;
}
$request = $event->getRequest();
$session = $request->getSession();
$routeName = $request->get('_route');
$routeParams = $request->get('_route_params');
if ($routeName[0] == "_") {
return;
}
$routeData = ['name' => $routeName, 'params' => $routeParams];
// Don't store the same route twice
$thisRoute = $session->get('this_route', []);
if ($thisRoute == $routeData) {
return;
}
$session->set('last_route', $thisRoute);
$session->set('this_route', $routeData);
}
}
services.yml
myapp.last_route_event_listener:
class: MyApp\EventListener\LastRouteListener
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 30 }
Und schließlich habe ich einen neuen Controller, die über ein Dropdown-Menü der Anwendung navbar, der der Benutzer gerade, aber mit einem anderen Jahr die aktuelle Seite zeigt hinzugefügt
ArchiveController.php
class ArchiveController extends Controller
{
public function switchYearAction(Request $request, $year)
{
$session = $request->getSession();
$lastRoute = $session->get('last_route');
$route = $lastRoute["name"];
$routeParams = $lastRoute["params"];
if (array_key_exists("year", $routeParams)) {
$routeParams["year"] = $year;
$session->set("current_year", $year);
}
return $this->redirect($this->generateUrl($route, $routeParams));
}
}
hier angekommen, alles funktioniert. Wenn ein Benutzer ein anderes Datum auswählt, zeigt die Anwendung die gleiche Seite an, jedoch mit dem neuen Datum.
Allerdings, und da ist mein Problem, wenn, aus einem früheren Jahr, der Benutzer auf einen Link auf der Seite klickt, kommen wir zurück zum tatsächlichen Jahr. Ganz normal, weil Twig-Pfade in der Anwendung den Routing-Parameter 'Jahr' nicht füllen und der Router standardmäßig das aktuelle Jahr angibt.
Also, meine Frage ist: Wie kann ich das gewählte Jahr im Speicher behalten und es als Route Parameter verwenden?
Zuerst hatte ich gedacht, über die lokale var Einstellung ‚CURRENT_YEAR‘, wenn die Anwendung die switchYearAction() verwendet, aber Symfony gibt einen Fehler (‚Gefrorene Variable‘)
Als nächstes wird ein über die Verwendung gedacht hatte, Sitzungs-Var speichert das ausgewählte Jahr, aber ich kann nicht auf die Sitzung innerhalb meiner Erweiterung MyAppExtension zugreifen.
Es könnte eine dritte Lösung sein, die in Update besteht alle Twig Pfade und Controller-Umleitung(), aber es stellt eine viel Linie zu bearbeiten ...
Oder vielleicht mit einem routeEventListener ... aber ich don‘ Ich weiß, wie es weitergeht.
Vielen Dank im Voraus.
Vielen Dank für Ihre Antwort. Das Problem, alle Twig-Pfade und alle Weiterleitungs-URLs bearbeiten zu müssen, bleibt jedoch bei Ihrer Lösung bestehen. Ich bin auf der Suche nach einem Routenereignis-Listener, der den Routenaufruf abfangen und automatisch die Variable current_year mit der Sitzungsvariable oder standardmäßig mit dem aktuellen Jahr füllen kann. –
Siehe diese Antwort @BenjaminLemoine http://StackOverflow.com/A/13495302/1031898 sollte sein, was Sie wollen. – chrisguitarguy
Super! Diese Antwort ist genau das, was ich brauche. Vielen Dank ! Ich werde meinen aktualisierten Code in diesem Thread posten. –