wake-up-neo.net

Routing in Symfony2

So richten Sie das Standardrouting in Symfony2 ein

In Symfony1 sah es ungefähr so ​​aus:

homepage:
  url:   /
  param: { module: default, action: index }

default_symfony:
  url:   /symfony/:action/...
  param: { module: default }

default_index:
  url:   /:module
  param: { action: index }

default:
  url:   /:module/:action/...
25
umpirsky

Ich habe im Kochbuch nach einer Antwort darauf gesucht und glaube, ich habe es hier gefunden. Standardmäßig gilt für alle Routenparameter, dass sie mit einem beliebigen Zeichen außer dem/-Zeichen ([^ /] +) übereinstimmen. Dieses Verhalten kann jedoch mit dem Anforderungsschlüsselwort überschrieben werden, indem er erzwingt, dass es mit any übereinstimmt Zeichen.

Im Folgenden sollte eine Standardroute erstellt werden, die alle anderen abfängt - und sollte daher als letzte in Ihrer Routingkonfiguration angezeigt werden, da die folgenden Routen mit never übereinstimmen. Um sicherzustellen, dass es auch mit "/" übereinstimmt, ist ein Standardwert für den URL-Parameter enthalten.

default_route:
    pattern: /{url}
    defaults: { _controller: AcmeBundle:Default:index, url: "index" }
    requirements:
        url: ".+"
28
Longsight

Ich denke nicht, dass dies mit der Standard-Routing-Komponente möglich ist. Schauen Sie sich dieses Bundle an, es könnte helfen: https://github.com/hidenorigoto/DefaultRouteBundle

8
dxb

// Symfony2 PR10

in routing.yml:

default:
    pattern:  /{_controller}

Sie können diese Art von URLs verwenden: http: // localhost/MySuperBundle: MyController: myview

8
Denis Gorbachev

Die Symfony2-Standardroutingkomponente unterstützt dies nicht, aber dieses Paket schließt die Lücke, die Symfony1 noch übrig hat:

https://github.com/LeaseWeb/LswDefaultRoutingBundle

Es macht, was Sie erwarten. Sie können ein Bundle standardmäßig mithilfe dieser Syntax routen:

FosUserBundle:
  resource: "@FosUserBundle"
  prefix:   /
  type:     default

Es scannt Ihr Bundle und fügt Ihrer Routertabelle automatisch Routen hinzu, die Sie durch Ausführen folgender Schritte debuggen können:

app/console router:debug

Beispiel für automatisch hinzugefügte Standardrouten:

[router] Current routes
Name                          Method Pattern
fos_user.user.login_check     ANY    /user/login_check.{_format}
fos_user.user.logout          ANY    /user/logout.{_format}
fos_user.user.login           ANY    /user/login.{_format}
...

Sie sehen, dass es auch die automatische "Formatauswahl" unter Verwendung einer Dateierweiterung (html, json oder xml) unterstützt.

4
mevdschee

Hier ist ein Beispiel: http://docs.symfony-reloaded.org/master/quick_tour/the_big_picture.html#routing

Eine Routendefinition hat nur einen obligatorischen Parameter pattern und drei optionale Parameter defaults, requirements und options.

Hier ist eine Route aus meinem eigenen Projekt:

video:
    pattern:  /watch/{id}/{slug}
    defaults: { _controller: SiteBundle:Video:watch }
    requirements: { id: "\d+", slug: "[\w-]+" 
3
Crozin

Alternativ können Sie die Annotation @Route direkt in einer Controller-Datei verwenden. siehe https://github.com/sensio/SensioFrameworkExtraBundle/blob/master/Resources/doc/annotations/routing.rst

Bei den Standardrouten denke ich, dass Symfony2 die explizite Zuordnung von Routen anregt.

2
ken

Das Erstellen einer Standardroute ist keine gute Art der Programmierung. Warum? Aus diesem Grund wurde die Ausnahme. Implementiert. Symfony2 ist so aufgebaut, dass nur die richtigen Dinge richtig gemacht werden.

Wenn Sie alle "nicht gefundenen" Routen umleiten möchten, sollten Sie eine Ausnahme wie NotFound404 oder ähnliches verwenden. Sie können diese Seite sogar selbst anpassen.

Eine Route dient nur einem Zweck. Immer. Andere denken, ist schlecht.

2

Sie können ein eigenes Bundle erstellen, das alle Anforderungen verarbeitet und URL-Parameter verwendet, um eine Zeichenfolge zu erstellen, die an die Weiterleitungsmethode des Controllers übergeben wird. Aber das ist ziemlich beschissen, ich würde auf gut definierte Routen gehen, es hält Ihre URLs sauberer und entkoppelt die URL- und Controller-Namen. Wenn Sie ein Bündel oder etwas umbenennen, müssen Sie dann Ihre URLs umgestalten?

1
MFoster

Wenn Sie ein "Alle fangen" erstellen möchten, wäre es am besten, das Ereignis KernelEvents::EXCEPTION zu aktivieren. Dieses Ereignis wird immer dann ausgelöst, wenn eine Ausnahme auf die Variable HttpKernel fällt. Dies schließt die Variable NotFoundHttpException ein, die ausgelöst wird, wenn der Router keine Route zu einem Controller auflösen kann.

Der Effekt ähnelt der stilisierten 404-Seite von Symfony, die gerendert wird, wenn Sie die Anforderung über app_dev.php senden. Anstatt eine 404 zurückzugeben, führen Sie die gewünschte Logik aus.

1
D H

Es kommt darauf an ... Einige von mir sehen so aus: 

api_email:
resource: "@MApiBundle/Resources/config/routing_email.yml"
prefix: /

und einige sehen so aus 

api_images:
path:     /images/{listingId}/{width}/{fileName}
defaults: { _controller: ApiBundle:Image:view, listingId: null, width: null, fileName: null }
methods:  [GET]
requirements:
    fileName: .+
0
luminol