この記事の例では、Symfony2 がドメイン名ベースのルーティング実装を作成する方法を説明します。参考までに皆さんと共有してください。詳細は次のとおりです。
HTTP ドメイン名で受信リクエストを照合できます
YAML メソッド
mobile_homepage: path: / host: m.example.com defaults: { _controller: AcmeDemoBundle:Main:mobileHomepage } homepage: path: / defaults: { _controller: AcmeDemoBundle:Main:homepage }
XML メソッド
<?xml version="1.0" encoding="UTF-8" ?> <routes xmlns="http://symfony.com/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd"> <route id="mobile_homepage" path="/" host="m.example.com"> <default key="_controller">AcmeDemoBundle:Main:mobileHomepage</default> </route> <route id="homepage" path="/"> <default key="_controller">AcmeDemoBundle:Main:homepage</default> </route> </routes>
PHP メソッド
use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\Route; $collection = new RouteCollection(); $collection->add('mobile_homepage', new Route('/', array( '_controller' => 'AcmeDemoBundle:Main:mobileHomepage', ), array(), array(), 'm.example.com')); $collection->add('homepage', new Route('/', array( '_controller' => 'AcmeDemoBundle:Main:homepage', ))); return $collection;
2 つのルートは同じパス / に一致しますが、最初のルートはドメイン名 m.example.com にのみ一致します。
プレースホルダーを使用する
このドメイン名オプションは、プレースホルダー パス マッチング システムを使用します。これは、ドメイン名に一致するドメイン名をプレースホルダーとして使用できることを意味します。これらのプレースホルダーに条件とデフォルトのオプションを設定することもできます。たとえば、m.example.com と mobile.example.com を一致させたい場合は、次のように実行できます
YAML
projects_homepage: path: / host: "{project_name}.example.com" defaults: { _controller: AcmeDemoBundle:Main:mobileHomepage } homepage: path: / defaults: { _controller: AcmeDemoBundle:Main:homepage }
XML
<?xml version="1.0" encoding="UTF-8" ?> <routes xmlns="http://symfony.com/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd"> <route id="projects_homepage" path="/" host="{project_name}.example.com"> <default key="_controller">AcmeDemoBundle:Main:mobileHomepage</default> </route> <route id="homepage" path="/"> <default key="_controller">AcmeDemoBundle:Main:homepage</default> </route> </routes>
PHP
use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\Route; $collection = new RouteCollection(); $collection->add('project_homepage', new Route('/', array( '_controller' => 'AcmeDemoBundle:Main:mobileHomepage', ), array(), array(), '{project_name}.example.com')); $collection->add('homepage', new Route('/', array( '_controller' => 'AcmeDemoBundle:Main:homepage', ))); return $collection;
ドメイン名をハードコーディングしたくない場合は、次のようにサービス パラメータを使用することもできます
YAML
mobile_homepage: path: / host: "{subdomain}.example.com" defaults: _controller: AcmeDemoBundle:Main:mobileHomepage subdomain: m requirements: subdomain: m|mobile homepage: path: / defaults: { _controller: AcmeDemoBundle:Main:homepage }
XML
<?xml version="1.0" encoding="UTF-8" ?> <routes xmlns="http://symfony.com/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd"> <route id="mobile_homepage" path="/" host="{subdomain}.example.com"> <default key="_controller">AcmeDemoBundle:Main:mobileHomepage</default> <default key="subdomain">m</default> <requirement key="subdomain">m|mobile</requirement> </route> <route id="homepage" path="/"> <default key="_controller">AcmeDemoBundle:Main:homepage</default> </route> </routes>
PHP
use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\Route; $collection = new RouteCollection(); $collection->add('mobile_homepage', new Route('/', array( '_controller' => 'AcmeDemoBundle:Main:mobileHomepage', 'subdomain' => 'm', ), array( 'subdomain' => 'm|mobile', ), array(), '{subdomain}.example.com')); $collection->add('homepage', new Route('/', array( '_controller' => 'AcmeDemoBundle:Main:homepage', ))); return $collection;
Tips
Makeデフォルトのオプションはドメイン プレースホルダーです。それ以外の場合は、このルートを使用して URL を生成するたびにドメイン値を含める必要があります。
含まれているルーティング ルール マッチングを使用する
次のようにルーティング設定ファイルをインポートすることでドメイン オプションを設定できます
YAML
mobile_homepage: path: / host: "m.{domain}" defaults: _controller: AcmeDemoBundle:Main:mobileHomepage domain: '%domain%' requirements: domain: '%domain%' homepage: path: / defaults: { _controller: AcmeDemoBundle:Main:homepage }
XML
<?xml version="1.0" encoding="UTF-8" ?> <routes xmlns="http://symfony.com/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd"> <route id="mobile_homepage" path="/" host="m.{domain}"> <default key="_controller">AcmeDemoBundle:Main:mobileHomepage</default> <default key="domain">%domain%</default> <requirement key="domain">%domain%</requirement> </route> <route id="homepage" path="/"> <default key="_controller">AcmeDemoBundle:Main:homepage</default> </route> </routes>
PHP
use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\Route; $collection = new RouteCollection(); $collection->add('mobile_homepage', new Route('/', array( '_controller' => 'AcmeDemoBundle:Main:mobileHomepage', 'domain' => '%domain%', ), array( 'domain' => '%domain%', ), array(), 'm.{domain}')); $collection->add('homepage', new Route('/', array( '_controller' => 'AcmeDemoBundle:Main:homepage', ))); return $collection;
ドメイン名hello.example.com は、ロードされる新しいルート構成ファイル内のすべてのルートに設定されます
コントローラーをテストします
正しく設定したい場合は、リクエスト オブジェクトに HTTP ドメイン名ヘッダーを設定する必要がありますtest function
acme_hello: resource: '@AcmeHelloBundle/Resources/config/routing.yml' host: "hello.example.com"
この記事が皆さんの Symfony2 フレームワークに基づく PHP プログラムの設計に役立つことを願っています。
ドメイン名に基づいてルーティングを作成する Symfony2 の関連例については、PHP 中国語 Web サイトに注目してください。