web-dev-qa-db-ja.com

Symfony2ルーティング-ルートサブドメイン

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

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

指定されたホスト名に基づいてリクエストをルーティングしたい:
foo.example.com
bar.example.com
{{サブドメイン}}。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));

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

24
user523736

これが私の解決策です:

の中に config.yml app 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());
   }
}
25

これがSymfonyv2.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 }
42
Dan Blows

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

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

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

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

2

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

class DefaultController extends PowmaController {

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

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

この機能を追加するSymfony1.2には プラグイン があります。コードは1つのファイルに数百行しかないので、Symfony 2に移植するのはそれほど難しいことではありません。しかし、Sensioのドキュメントはまだ完全にはありません。

また、ルートにサブドメインを含めて、コントローラーからドメインをフェッチし、そこで処理することもできませんでした。私はそれがこのメソッドだと思います: getHost()

1

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

0
Paul Andrieux