ドメイン名によってコントローラを切り替える手段について

211 views
Skip to first unread message

yuki

unread,
Mar 15, 2014, 3:07:04 AM3/15/14
to symfony-...@googlegroups.com
現在 Symfony2 を勉強している者です。
どうぞよろしくお願いします。

さて、Symfony2 をインストールし、複数のドメインをひとつの Symfony で運用しようとしているのですが、
アクセスしたドメイン名によって使用するコントローラを 切り替えることは可能なのでしょうか。

標準で …Bundle\Controller\* 以下に配置したコントローラはすべて読み込まれてしまうようなのですが、
たとえば、
example.com だったなら AaaController.php
example.jp だったなら BbbController.php
だけ読み込む、というようにしたいのです。 

それぞれのコントローラ冒頭に、

/**
 * AaaController.
 *
 * @Route("", host = "example.com")
 */
 
 
/**
 * BbbController.
 *
 * @Route("", host = "example.jp")
 */
 
このような記述をして振り分けようとしたのですが、全コントローラ読み込まれてしまうことには変わりないようで、
それぞれのコントローラに、下記のような同一name の Action を設定することはできませんでした。
(各ドメインと名とも、共通の layout の twig 内で、{{ path('homepage') }} このように共通のパスの使用をしたいためです)
    /**
     * @Route("/", name = "homepage")
     * @Template
     */
共通の name を使用すると、上書きされて一方は無効となってしまうようで、上書きされてしまったほうは Not Found となってしまいます。


つたない説明で申し訳ありませんが、アドバイスをちょうだいできましたら幸いです。
また、不明瞭なところがありましたら、゛うかご指摘いただければと思います。

brtriver

unread,
Mar 15, 2014, 5:49:21 AM3/15/14
to symfony-users-ja
前田です。こんにちは。

ルーティングでホスト名を指定することができます。
http://symfony.com/doc/current/components/routing/hostname_pattern.html

これでやりたいことが出来ると思います。

2014年3月15日 16:07 yuki <iphones...@gmail.com>:
> --
> --
> -------------------
> Symfonyに関する疑問・質問、ユーザー会の活動やサイトに対するご意見、その他雑談など、お気軽にMLへ投稿してください!
>
>
> 日本Symfonyユーザー会
> http://www.symfony.gr.jp/
>
> 日本Symfonyユーザー会メーリングリスト
> http://groups.google.com/group/symfony-users-ja
>
> ---
> このメールは Google グループのグループ「日本Symfonyユーザー会」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> symfony-users-...@googlegroups.com にメールを送信してください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

yuki

unread,
Mar 15, 2014, 6:43:04 AM3/15/14
to symfony-...@googlegroups.com
前田さん

質問いたしました yuki です。
アドバイスをいただきましてありがとうございます!

…大変恐縮ですが、追加で質問いたしたいことがあります。

まずいただいたアドバイスをもとに、 /app/config/roting.yml に下記の設定をすると、
希望どおりドメインによって読み込むコントローラを変えることができました。

example_com:
    host:     "example.com"
    resource: "@MyTestBundle/Controller/AaaController.php"
    type:     annotation
    prefix:   / 
 
example_jp:
    host:     "example.jp"
    resource: "@MyTestBundle/Controller/BbbController.php"
    type:     annotation
    prefix:   /

共通で利用したい Action があるので、AaaController.php BbbController.php ともに、Controller/CommonController.php を継承しました。
と、ここで期待どおりの挙動をしない事象が生じました。
CommonController.php では、別ドメインにルーティング設定をした下記のような Action を記載しています。

    /**
     * @Route("/commonUrl", host = "example.org", name = "common_page")
     * @Template
     */
    public function commonPageAction()
    {
    …
    }

期待する挙動としては、twig で {{ path("common_page") }} と指定すると <http://example.org/commonUrl> と出力されてほしいところなのですが、
このコントローラを継承して利用しているせいか、<http://example.com/commonUrl> だったり <http://example.jp/commonUrl> と出力されてしまいます。

この事象をうまく解消する手段について、ご教授願えましたら幸いです。

brtriver

unread,
Mar 15, 2014, 7:16:02 AM3/15/14
to symfony-users-ja
前田です。

hostを@routeアノテーションで指定したことがないので推測ですが。

今ざっと@routeのアノテーションのドキュメントを見てもhostについて記述がないので、
もしかしたらアノテーションでは指定できないのかもしれないですね。

http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/routing.html

> twig で {{ path("common_page") }} と指定すると <http://example.org/commonUrl> と出力されてほしいところなのですが

実際に動いているホスト名を用いてpathが生成されているだけのように思えます。
なので、どちらか指定したドメインでのみ動いて欲しいのであればrouting.[yml|xml]で
そのページのルーティングをhost付きで指定すればできそうな気がします。
そして、もしそうであれば、

> 共通で利用したい Action があるので、AaaController.php BbbController.php ともに、Controller/CommonController.php を継承しました。

のように継承する必要はないんじゃないかと。
普通にCommonControllerのアクションをrouting.xxx で指定すれば大丈夫なので。

そうではなく、共通の処理を定義しておきたいということであれば、継承ではなくtraitではないかなと。

推測で書いているので間違いがあるかもしれないですが、参考になれば幸いです。


2014年3月15日 19:43 yuki <iphones...@gmail.com>:
> --
> --
> -------------------
> Symfonyに関する疑問・質問、ユーザー会の活動やサイトに対するご意見、その他雑談など、お気軽にMLへ投稿してください!
>
>
> 日本Symfonyユーザー会
> http://www.symfony.gr.jp/
>
> 日本Symfonyユーザー会メーリングリスト
> http://groups.google.com/group/symfony-users-ja
>
> ---
> このメールは Google グループのグループ「日本Symfonyユーザー会」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには、symfony-users-...@googlegroups.com
> へメールを送信してください。
> その他のオプションについては、https://groups.google.com/d/optout にアクセスしてください。

yuki

unread,
Mar 16, 2014, 6:24:57 AM3/16/14
to symfony-...@googlegroups.com
前田さん

質問いたしました yuki です。
アドバイスをいただきましてありがとうございます。

いただいた助言をもとにまたいろいろ試していたのですが、そもそも解決したと思っていた点に誤りがありました。

example_com:
    host:     "example.com"
    resource: "@MyTestBundle/Controller/AaaController.php"
    type:     annotation
    prefix:   / 
 
example_jp:
    host:     "example.jp"
    resource: "@MyTestBundle/Controller/BbbController.php"
    type:     annotation
    prefix:   /

こちらの設定ですが、期待通りの挙動とはなっていませんでした。
双方に同じルーティング名を設定しているため、一方の URL が 404 となってしまうようでした。

つまり、routing.yml に記載する例でいいますと、下記のような設定を有効にしたいのです。

homepage:
    host:     "example.com"
    path:      /
    defaults:  { _controller: MyTestBundle:Aaa:index }
 
homepage:
    host:     "example.jp"
    path:      /
    defaults:  { _controller: MyTestBundle:Bbb:index }

あるいは、ドメインごとにロードする routing.yml (あるいは config.yml) を切り替える手段を考えるのがよいでしょうか。
度々のご質問申し訳ありません。
どうか、ご助言をいただけましたら幸いです。

brtriver

unread,
Mar 16, 2014, 7:47:00 AM3/16/14
to symfony-users-ja
前田です。

routing.ymlでhostを指定できる機能は、
たとえば、通常はhttpコンテンツだけど、問い合わせページなど別ドメインのhttpsコンテンツとして用意しているなどの場面だと思います。

なので、やりたいことがドメインごとにroutingを全く別にしたいというようなので、

> あるいは、ドメインごとにロードする routing.yml (あるいは config.yml) を切り替える手段を考えるのがよいでしょうか。

の方向だと思います。

自分だったら、ドメインごとにバーチャルホストでドキュメントルートも別に指定し、AppKernel.phpから別に作ると思います。

* AppKernelCom.php
* AppKernelJp.php

共通の部分をHogeBundleとして集約して、com用、jp用のコンテキストをComBundle, JpBundleにするとか。

ただ、ドメインごとにTOPページは違うけど、それ以外のページが全く同じコンテンツという場面が分からないのですが、
コンテキストが異なると思われるので、ログやキャッシュも別にしたほうが良いと思いました。



2014年3月16日 19:24 yuki <iphones...@gmail.com>:

yuki

unread,
Mar 22, 2014, 10:24:30 PM3/22/14
to symfony-...@googlegroups.com
前田さん

質問いたしました yuki です。
アドバイスをいただきましてありがとうございます!
立て込んでおりまして、お礼が遅れてしまい大変申し訳ございません。

そもそもの構成の構想に修正すべきところがあったということで、
アドバイスいただいたように、あらためてバンドルをわけるところから再挑戦してみたいと思います。

つたない文章にもかかわらず、幾度もご助言をいただきましてありがとうございました!

2014年3月16日日曜日 20時47分00秒 UTC+9 brtriver(Masao Maeda):
> このグループから退会し、グループからのメールの配信を停止するには、symfony-users-ja+unsubscribe@googlegroups.com
Reply all
Reply to author
Forward
0 new messages