it-swarm.com.de

Symfony2 Routing - Subdomains weiterleiten

Gibt es eine Möglichkeit, Hostnamen-basiertes Routing in Symfony2 einzurichten?

Zu diesem Thema habe ich in der offiziellen Dokumentation nichts gefunden.
http://symfony.com/doc/2.0/book/routing.html

Ich möchte die Anfrage basierend auf dem angegebenen Hostnamen weiterleiten:
foo.example.com
bar.example.com
{{Subdomain}}. example.com

Im Wesentlichen würde der Controller die aktuelle Unterdomäne als Parameter übergeben bekommen.

Ähnlich wie bei der Zend-Lösung:
http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.routes.hostname

$hostnameRoute = new Zend_Controller_Router_Route_Hostname(
    ':username.users.example.com',
    array(
        'controller' => 'profile',
        'action'     => 'userinfo'
    )
);
$plainPathRoute = new Zend_Controller_Router_Route_Static('');

$router->addRoute('user', $hostnameRoute->chain($plainPathRoute));

Ich hoffe, dass es möglich ist und ich habe es irgendwie verpasst.
Danke im Voraus!

24
user523736

Das ist meine Lösung:

Fügen Sie im Verzeichnis config.yml inside die folgenden Zeilen hinzu:

services:
   kernel.listener.subdomain_listener:
       class: Acme\DemoBundle\Listener\SubdomainListener
       tags:
           - { name: kernel.event_listener, event: kernel.request, method: onDomainParse }

Dann erstelle die Klasse SubdomainListener.php als:

<?php

namespace Acme\DemoBundle\Listener;

use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\Event;

class SubdomainListener
{
   public function onDomainParse(Event $event)
   {
       $request = $event->getRequest();
       $session = $request->getSession();

       // todo: parsing subdomain to detect country

       $session->set('subdomain', $request->getHost());
   }
}
24

Nur um darauf hinzuweisen, dass dies jetzt in Symfony v2.2 hinzugefügt wurde - http://symfony.com/doc/master/components/routing/hostname_pattern.html .

mobile_homepage:
    path:     /
    Host:     m.{domain}
    defaults: { _controller: AcmeDemoBundle:Main:mobileHomepage }
    requirements:
        domain: %domain%

homepage:
    path:  /
    defaults: { _controller: AcmeDemoBundle:Main:homepage }
42
Dan Blows

Ich gehe davon aus, dass das Subdomain-Routing in symfony2 ein Prozess ist, bei dem ein definierter Controller gemäß dem Subdomain-Teil des Hostnamens ausgewählt wird, und die Sitzungsvariable hilft nicht, einen definierten Controller aufzulösen.

Ich setze das Anforderungsattribut: _controller im Kernel-Listener wie folgt

$request->attributes->set('_controller','AcmeBundle:Demo:main');

Dies ist eine Hilfe zum Weiterleiten an einen definierten Controller, aber ich verliere den Debug-Profiler in der Entwicklungsumgebung. Dennoch kann ich keine Ursache erkennen

2

Alternativ können Sie den Hostnamen im Controller abrufen:

class DefaultController extends PowmaController {

  /**
   * @Route("/test")
   */
  public function testAction() {
    return new Response( 'Hostname ' . $this->getRequestHostnameString() );
  }

  function getRequestHostnameString() {
    return $this->getRequest()->getHost();
  }
2
Mike

Es gibt ein Plugin für Symfony 1.2, das diese Funktionalität hinzufügt. Der Code besteht nur aus ein paar hundert Zeilen in einer einzelnen Datei und sollte nicht zu schwierig sein, um auf Symfony 2 zu portieren. Die Dokumentation von Sensio ist jedoch noch nicht vollständig.

Sie könnten auch die Unterdomäne nicht in die Route aufnehmen und die Domäne vom Controller abrufen und dort verarbeiten. Ich denke, es ist diese Methode: getHost ()

1

Hier ist ein Bundle, das mehrere Domain-Sites verwaltet: https://github.com/AppVentus/MultiDomainBundle

0
Paul Andrieux