Gemäß der Symfony-Dokumentation sollte eine wie unten definierte Route den angegebenen Controller für beide /hello/bob
und Folgendes auslösen /hello/bob/bobby
:
_hello:
path: /hello/{names}
defaults: { _controller: \Drupal\mymodule\Controller\Main::Controller }
requirements:
_access: 'TRUE'
names: .+
Im Falle einer Anfrage an /hello/bob/bobby
den {names}
Parameter wäre "bob / bobby" (Schrägstrich intakt) und es wäre Sache des Controllers, dies in mehrere Variablen aufzuteilen oder als einzelne Zeichenfolge zu belassen. Der Trick dazu ist der geänderte Regex (". +"), Mit dem dieser {names}
Parameter gefiltert wird.
Dieser Stackoverflow-Beitrag impliziert auch, dass benutzerdefinierte Regex verwendet werden können, um Schrägstriche in einem Routenparameter zuzulassen (zumindest in Symfony 2).
Wenn ich dies gegen Drupal 8.0.0-beta15 versuche, funktioniert es nicht und der angegebene Controller wird nur für eine Anfrage an ausgelöst /hello/bob
. Allerdings kann ich bestätigen , dass dies gewöhnungs in früheren Betas Arbeit (ich glaube , bis ~ beta13).
Hat sich an der Integration von Drupal in die Symfony-Routing-Komponente etwas geändert, das dies erklären würde? Vielleicht gibt es eine alternative Möglichkeit, um Schrägstriche in Routing-Parametern zu übergeben? Ich weiß, dass es im Kern eine Bewegung in Richtung Symfony 3.0 gibt , aber ich bin mir nicht sicher, ob dies die Dinge erklären könnte.
Ich weiß auch, dass Routenteilnehmer verfügbar sind, um dynamische Routenstrukturen zu verwalten. Der Fall, an dem ich arbeite, erfordert jedoch eine nahezu unendliche Kombination / Anzahl dynamischer Parameter am Ende eines Basispfads (die jedoch in meinem Controller trivial zu analysieren sind). Ich versuche auch, Abfragezeichenfolgen (z. B. /hello?names[]=bob&names[]=bobby
) für diesen Fall zu vermeiden .
Hauptsächlich bin ich nur verwirrt über die Trennung von der Symfony-Dokumentation, die zu besagen scheint, dass dies möglich sein sollte.
Zusätzliche Bemerkungen
Nach der Veröffentlichung dieser Frage habe ich entdeckt , diese Diskussion in den Kern Warteschlangen D8: [Diskussion] Tropfen automatisierte extra Argument übergeben: Y / N . Es scheint zu dem Schluss zu kommen, dass die Unterstützung für "Menüschwänze" (was im Wesentlichen das ist, wonach ich strebe) in D8 offiziell eingestellt wird. Diese Diskussion endete vor 3 Jahren und daher kann ich nur vermuten, dass einige der allgemeineren Implementierungsspezifikationen bis vor kurzem nicht vollständig umgesetzt wurden (~ beta13). Dies könnte erklären, warum ich diese Änderung erst jetzt bemerkt habe.
Ich vermute, dass Drupal (nicht Symfony) jetzt eine 404-Antwort basierend auf der durch Schrägstriche getrennten Anforderung generiert, bevor eine der Symfony-spezifischen Routing-Logik die Route weiter zerlegt (und es ist param-spezifischer Regex usw.). Wenn dies der Fall ist, könnte dies erklären, warum die oben beschriebene Technik nicht mehr funktioniert. Ich frage mich jedoch immer noch, ob es alternative Möglichkeiten gibt, um mit diesem Bedarf umzugehen, bei denen die Verwendung von Abfrageparametern und benutzerdefinierten Routenabonnenten vermieden wird.
path: /hello/{names}
undusername: .+
haben miteinander zu tun.Antworten:
Sie können den Pfad ändern, indem Sie eine Klasse hinzufügen, die InboundPathProcessorInterface implementiert
Auf diese Weise interpretiert der Router den Pfad
/hello/bob/bobby
als/hello/bob:bobby
und Sie erhalten die Parameter getrennt durch:
(oder jedes andere Zeichen, das nicht mit den Parametern in Konflikt steht) in Ihrem Controller.Sie müssen die Klasse auch als Dienst in mymodule.services.yml registrieren (stellen Sie sicher, dass die Priorität höher als 200 ist).
quelle
Sie können Folgendes tun, um Pfadparameter abzurufen: In diesem Fall möchte ich alles, was nach / rest / kommt, als Array von Zeichenfolgen abrufen.
Ihre Datei yourmodule.routing.yml sollte ungefähr so aussehen.
oder im Pfad \ zu \ yourmodule \ src \ Routing \ RouteProvider.php
Fügen Sie Ihrem Modul anschließend wie folgt einen Pfadprozessor hinzu. Pfad \ zu \ yourmodule \ src \ PathProcessor \ YourModulePathProcessor.php
Führen Sie in Ihrem Controller Folgendes aus: Pfad \ zu \ yourmodule \ src \ Controller \ YourController.php
quelle
Alternative Lösung:
Erstellen Sie einen Routenparameter, der ein JSON-Array empfängt.
mymodule.routing.yml
\ Drupal \ mymodule \ Controller \ Main
quelle