24

Symfony2でホスト名ベースのルーティングを設定する方法はありますか?

公式ドキュメントでこのトピックについて何も見つかりませんでした。
http://symfony.com/doc/2.0/book/routing.html

指定されたホスト名に基づいてリクエストをルーティングしたい:
foo.example.com
bar.example.com
{{subdomain}}.example.com

したがって、本質的に、コントローラーはパラメーターとして渡された現在のサブドメインを取得します。

Zend ソリューションと同様:
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));

それが可能であることを願っていますが、どういうわけかそれを逃しました。
前もって感謝します!

4

6 に答える 6

43

これが Symfony v2.2 に追加されたことを指摘しておきます - 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 }
于 2013-01-30T17:15:37.390 に答える
25

これが私の解決策です:

config.ymlapp dir 内に次の行を追加します。

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

次に、クラスSubdomainListener.phpを次のように作成します。

<?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());
   }
}
于 2011-08-14T10:27:58.077 に答える
2

または、コントローラーでホスト名を取得します。

class DefaultController extends PowmaController {

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

  function getRequestHostnameString() {
    return $this->getRequest()->getHost();
  }
于 2012-03-07T21:08:49.950 に答える
2

symfony2 でのサブドメイン ルーティングは、ホスト名のサブドメイン部分に従って定義済みコントローラーを選択するプロセスであり、セッション変数は定義済みコントローラーを解決するのに役立たないと仮定します。

リクエスト属性を設定します:_controller、このようなカーネルリスナーで

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

これは、定義されたコントローラーにルーティングするのに役立ちますが、開発環境でデバッグ プロファイラーが失われ、まだ原因を検出できません

于 2012-02-13T15:14:02.323 に答える
0

複数のドメイン サイトを処理するバンドルは次のとおりです: https://github.com/AppVentus/MultiDomainBundle

于 2013-06-26T08:38:52.097 に答える