ルーティング
美しい URL は、本格的な Web アプリケーションには絶対に必要です。これは、index.php?article_id=57
のような醜い URL が /read/intro-to-symfony
に置き換えられることを意味します。
柔軟性を持つことはさらに重要です。ページの URL を /blog
から /news
に変更するには何をする必要がありますか?変更を加えるために追跡および更新する必要があるリンクはいくつありますか? Symfony のルーティングを使用すると、これは簡単です。
Symfony Router を使用すると、アプリケーションのさまざまな領域にマッピングするクリエイティブ URL を定義できます。この章を終えると、次のことができるようになります。
コントローラーにマップする複雑なルートを作成する
テンプレートとコントロールで生成するサーバー内の URL
バンドルからルーティング リソースをロードします (他の場所からでも可能)
デバッグ ルーティング
¶
Aroute は、URL パス (パス) からコントローラー (コントローラー) へのマッピングを指します。たとえば、いくつかの URL: /blog/my-post と
/blog/all-about-symfony を照合し、「それをクエリしてレンダリングできる」にルートを送信したいとします。コントローラーのブログ投稿「 」。ルーティングは非常に簡単です:
Annotations:// src/AppBundle/Controller/BlogController.phpnamespace AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller;use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; class BlogController extends Controller{ /** * @Route("/blog/{slug}", name="blog_show") */ public function showAction($slug) { // ... }}
YAML:# app/config/routing.ymlblog_show: path: /blog/{slug} defaults: { _controller: AppBundle:Blog:show }
XML:<!-- app/config/routing.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="blog_show" path="/blog/{slug}"> <default key="_controller">AppBundle:Blog:show</default> </route></routes>
PHP:// app/config/routing.phpuse Symfony\Component\Routing\RouteCollection;use Symfony\Component\Routing\Route; $collection = new RouteCollection();$collection->add('blog_show', new Route('/blog/{slug}', array( '_controller' => 'AppBundle:Blog:show',))); return $collection;
blog_show ルーティング パターンを定義し、
/blog/* のような URL と一致させるために使用し、関連するパラメータまたはワイルドカードには
slug を使用します を表し、渡されます。
/blog/my-blog-post のような URL の場合、
slug 変数は
my-blog-post の値を取得し、コントローラーによって使用されます。 Meishi
blog_show は内部名であり、実質的な意味はなく、単なる一意の識別子です。後で、これを使用して URL を生成できます。
_controller パラメーターは、ルートで指定された URL に対してどのコントローラーを実行する必要があるかを symfony に指示する特別なキーです。
_controllerこの文字列は、
論理名と呼ばれます。これはルールに従い、特定の php クラスとメソッド、AppBundle\Controller\BlogController::showAction メソッドを指します。 ######おめでとう!ルートを作成し、コントローラーに接続しました。ここで、
/blog/my-post
showAction リクエストがアプリケーションに送信されると、そのリクエストにはクライアント リクエストの正確な「リソース」アドレスが含まれます。このアドレスは URL (または URI) と呼ばれ、 symfony ルーティング システムの目的は、URL を解析し、どのコントローラーを呼び出すかを決定することです。全体のプロセスは次のようになります: リクエストは Symfony のフロントエンド コントローラー ( symfony のコア (カーネル カーネル) では、ルーターがリクエストをチェックする必要があります。 Route は、入力 URL を特定のルートに照合し、実行されるコントローラー情報を含むルート情報を返します。 Symfony カーネルはコントローラーを実行し、最終的に app/config/routing.yml コントローラーが実行され、
$slug 変数は
my- と等しくなります。役職## #。 Symfony ルーティングの目標: リクエストされた URL をコントローラーにマップします。この目標に従って、最も複雑な URL のマッピングも簡単にするさまざまなテクニックを学びます。
ルーティング: より詳細な分析 ¶
/contact
、/blog/read-me
などになります。以下は HTTP リクエストの例です: GET /blog/my-blog-post
# ルーティングは、入力 URL を特定のツールに変換してコントローラーを実行します。 ルートの作成 app.php
など) によって処理されます。 Response
オブジェクトを返します。 ¶
Symfony は、単一のルーティング設定ファイルからすべてのルートをアプリケーションにロードします。美しいルーティング構成ファイルは通常、 ですが、アプリケーション構成ファイル (xml または php 形式の構成ファイルを含む) を通じて任意の場所にファイルを配置することもできます。
YAML:# app/config/config.yml
framework:
# ...
router: { resource: '%kernel.root_dir%/config/routing.yml' }
XML:<!-- app/config/config.xml --><?xml version="1.0" encoding="UTF-8" ?><container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:framework="http://symfony.com/schema/dic/symfony" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd http://symfony.com/schema/dic/symfony http://symfony.com/schema/dic/symfony/symfony-1.0.xsd"> <framework:config> <!-- ... --> <framework:router resource="%kernel.root_dir%/config/routing.xml" /> </framework:config></container>
PHP:// app/config/config.php$container->loadFromExtension('framework', array( // ... 'router' => array( 'resource' => '%kernel.root_dir%/config/routing.php', ),));
基本的なルーティング構成 ¶
ルートを定義するのは簡単で、一般的なアプリケーションには多くのルートが必要です。基本ルートには 2 つの部分が含まれます: path
match と defaults
array:
Annotations:// src/AppBundle/Controller/MainController.php // ...class MainController extends Controller{ /** * @Route("/") */ public function homepageAction() { // ... }}
YAML:# app/config/routing.yml_welcome: path: / defaults: { _controller: AppBundle:Main:homepage }
XML:<!-- app/config/routing.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="_welcome" path="/"> <default key="_controller">AppBundle:Main:homepage</default> </route> </routes>
PHP:// app/config/routing.phpuse Symfony\Component\Routing\RouteCollection;use Symfony\Component\Routing\Route; $collection = new RouteCollection();$collection->add('_welcome', new Route('/', array( '_controller' => 'AppBundle:Main:homepage',))); return $collection;
ルートはホームページと一致します ( /
) を作成し、AppBundle:Main:homepage
コントローラーにマッピングします。 _controller
文字列は、Symfony によって実行のために PHP 関数に変換されます。美的プロセスについては、この章 (コントローラーの命名パターン) で簡単に説明します。
パラメータを使用したルーティング ¶
ルーティング システムは、ルートを記述するための多くの興味深い方法をサポートしています。多くのルートには、1 つ以上の「パラメーターまたはワイルドカード」プレースホルダーを含めることができます。
Annotations:// src/AppBundle/Controller/BlogController.php // ...class BlogController extends Controller{ /** * @Route("/blog/{slug}") */ public function showAction($slug) { // ... }}
YAML:# app/config/routing.ymlblog_show: path: /blog/{slug} defaults: { _controller: AppBundle:Blog:show }
XML:<!-- app/config/routing.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="blog_show" path="/blog/{slug}"> <default key="_controller">AppBundle:Blog:show</default> </route></routes>
PHP:// app/config/routing.phpuse Symfony\Component\Routing\RouteCollection;use Symfony\Component\Routing\Route; $collection = new RouteCollection();$collection->add('blog_show', new Route('/blog/{slug}', array( '_controller' => 'AppBundle:Blog:show',))); return $collection;
きれいなパスは、任意の /blog/*
URL に一致します。さらに良いのは、美しい {slug}
プレースホルダーが自動的にコントローラーに一致することです。つまり、URL が /blog/hello-world
の場合、コントローラーの $slug
変数の値は hello-world
になります。これは、ブログ投稿タイトルの文字列を照合するために使用できます。
ただし、デフォルトではすべてのプレースホルダーが必要であるため、この方法でルーティングすると /blog
のような URL とは一致しません。もちろん、プレースホルダー (パラメーター) 値を defaults
配列に追加することでこれを変更することもできます。
{ワイルドカード} 条件を追加します ¶
作成したルートをざっと見てみましょう:
Annotations:// src/AppBundle/Controller/BlogController.php // ...class BlogController extends Controller{ /** * @Route("/blog/{page}", defaults={"page" = 1}) */ public function indexAction($page) { // ... } /** * @Route("/blog/{slug}") */ public function showAction($slug) { // ... }}
YAML:# app/config/routing.ymlblog: path: /blog/{page} defaults: { _controller: AppBundle:Blog:index, page: 1 }blog_show: path: /blog/{slug} defaults: { _controller: AppBundle:Blog:show }
XML:<!-- app/config/routing.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="blog" path="/blog/{page}"> <default key="_controller">AppBundle:Blog:index</default> <default key="page">1</default> </route> <route id="blog_show" path="/blog/{slug}"> <default key="_controller">AppBundle:Blog:show</default> </route></routes>
PHP:// app/config/routing.phpuse Symfony\Component\Routing\RouteCollection;use Symfony\Component\Routing\Route; $collection = new RouteCollection();$collection->add('blog', new Route('/blog/{page}', array( '_controller' => 'AppBundle:Blog:index', 'page' => 1,))); $collection->add('blog_show', new Route('/blog/{show}', array( '_controller' => 'AppBundle:Blog:show',))); return $collection;
問題を見つけられますか? ?どちらのルートも /blog/*
のような URL に一致します。 symfony ルーティングは常に、最初に一致する (ブログ) ルートを選択します。つまり、blog_show
ルートは常に一致します。対照的に、/blog/my-blog-post
のような URL は、最初の (blog
) ルートと一致し、my-blog-post
の値を返します。 {page}
パラメータに与えられます。
ルート | パラメータ | |||||||
---|---|---|---|---|---|---|---|---|
| blog_list
| $page = 2
| ||||||
blog_show | $スラッグ | = 私のブログ投稿
|
Controller クラス | メソッド名 | |
---|---|---|
BlogController | showAction |
|