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!
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());
}
}
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 }
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
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();
}
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 ()
Hier ist ein Bundle, das mehrere Domain-Sites verwaltet: https://github.com/AppVentus/MultiDomainBundle