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));
私はそれが可能であることを願っています、そして私はどういうわけかそれを逃しました。
前もって感謝します!
これが私の解決策です:
の中に 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());
}
}
これが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 }
Symfony2のサブドメインルーティングは、ホスト名のサブドメイン部分に従って定義済みコントローラーを選択するプロセスであり、セッション変数は定義済みコントローラーの解決に役立たないと思います。
私はリクエスト属性を設定しました:_controller、このようなカーネルリスナーで
$request->attributes->set('_controller','AcmeBundle:Demo:main');
これは定義されたコントローラーにルーティングするのに役立ちますが、開発環境でデバッグプロファイラーが失われますが、それでも原因を検出できません
または、コントローラーでホスト名を取得します。
class DefaultController extends PowmaController {
/**
* @Route("/test")
*/
public function testAction() {
return new Response( 'Hostname ' . $this->getRequestHostnameString() );
}
function getRequestHostnameString() {
return $this->getRequest()->getHost();
}
複数のドメインサイトを処理するバンドルは次のとおりです: https://github.com/AppVentus/MultiDomainBundle