it-swarm.com.de

Warum funktioniert diese Route mit einem Schrägstrich und nicht mit einem Bindestrich?

Ich habe eine benutzerdefinierte dynamische Route definiert, die funktioniert, aber nicht ideal ist:

/**
* Defines dynamic routes.
*/
class GuideUnitRoutes {

  /**
   * {@inheritdoc}
   */
  public function routes() {
    $route_collection = new RouteCollection();

    $route = new Route(
      "/guide_name/{guide_id}/{child}",
      [
        '_controller' => '\Drupal\guides\Controller\GuidesUnitController::view',
        '_title' => 'Hello',
      ],
      [
        'guide_id' => '\\w+',
        'child' => '\\w+',
        '_permission' => 'access content',
      ]
    );

    $route_collection->add("guide.child", $route);

    $route_collection->setMethods(['GET']);

    return $route_collection;
  }

}

Wenn ich es als ideal definiere, funktioniert es nicht mehr:

/**
* Defines dynamic routes.
*/
class GuideUnitRoutes {

  /**
   * {@inheritdoc}
   */
  public function routes() {
    $route_collection = new RouteCollection();

    $route = new Route(
      "/guide_name-{guide_id}/{child}",
      [
        '_controller' => '\Drupal\guides\Controller\GuidesUnitController::view',
        '_title' => 'Hello',
      ],
      [
        'guide_id' => '\\w+',
        'child' => '\\w+',
        '_permission' => 'access content',
      ]
    );

    $route_collection->add("guide.child", $route);

    $route_collection->setMethods(['GET']);

    return $route_collection;
  }

}

Die Route, die funktioniert, ist guide_name/foo/bar, Während guide_name-foo/bar Nicht funktioniert. Ich würde gerne wissen warum.

Beim Lesen der Symfony-Dokumente sollte dies ein Problem sein. Aber aus irgendeinem Grund Drupal mag das nicht. Gibt es ein undokumentiertes (oder vielleicht ein Dokument, das ich verpasst habe), das die Abgrenzung von Token mit / Erzwingt, wenn Ich ändere den - In einen / Und lade dieselbe Route neu, die funktioniert.

Der Bindestrich ist nicht das Problem, Sie könnten einen Bindestrich im festen Teil verwenden, aber ...

Im Gegensatz zu generischen Symfony-Routen erfordert Drupal), dass ein Slug einen vollständigen Pfadteil einnimmt - den Teil zwischen zwei Schrägstrichen (oder alles nach dem letzten Schrägstrich).

https://www.drupal.org/docs/8/api/routing-system/parameters-in-routes/using-parameters-in-routes

Alternativ können Sie die Pfadverarbeitung verwenden, um den Pfad so umzuschreiben, dass er dem Routing-System Drupal] entspricht. Siehe Neue Routen in Drupal 8 * erforderlich *) ein statischer erster Teil?

5
4k4