忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/05/27 22:50 |
Symfony-5日目

http://symfony.localhost/frontend_dev.php/job/show/id/3
というURLで何故frontendアプリケーションのjobActions::executeShow()が実行されるのか、というお話。

まずテンプレート上で
url_for('a/b?c=d&e=f')
と書くと、url_for関数が勝手に
<a href="frontend_dev.php/a/b/c/d/e/f">といったふうにリンクを書き換えます。
indexという文字が現れたときとかの例外はありますが、今のところは特に気にする必要はありません。

リンク先をクリックした場合、まず第一引数であるaというモジュールを探し、その中のaActions::executeB()を実行しようとします。
三番目以降の引数はリクエストパラメータとなります。

まあこれが基本なのですが、そのルーティングの設定はapps/frontend/config/routing.ymlというファイルで決定されています。
これを変更することで、一部のリクエストだけ特別な処理を行ったりすることができます。
先にマッチしたルートが実行されるので、設定の順番は狭い順にします。

とりあえずデフォルトの設定を見てみます。
最初の段落、
 

1
2
3
homepage:
  url:   /
  param: { module: default, action: index }


/はindex.phpとかfrontend_dev.php/といった、引数が一個もない状態で来た場合にマッチします。
この場合、defaultモジュールのindexアクションが実行されます。
defaultモジュールは作成していませんが、Symfonyで最初から用意されているモジュールで、index以外にもerror404やdisabled、secureといった基本的なページが用意されています。
前回あったforward404Unless()は、内部的にdefaultモジュールのerror404アクションを呼び出しています。

homepage:は単なるラベルなので適当に変更してもかまいません。
ただ後述の@のためにわかりやすい名前にしておきましょう。

二段落目は
 

1
2
3
default_index:
  url:   /:module
  param: { action: index }

これはモジュール名だけやってきてアクション名がなかった場合、デフォルトのアクション名はindexにするよ、というだけの内容です。
たとえば
  param: { action: hoge }
に変更して
http://symfony.localhost/frontend_dev.php/job
にアクセスすると、jobモジュール内にhogeアクションが見つからないよ、というエラーになります。
http://symfony.localhost/frontend_dev.php/job/index
とアクション名まで書いた場合はきちんと表示されますが、これは最後の段落です。

1
2
default:
  url:   /:module/:action/*


モジュール名とアクション名が入っていれば、その後どのようなパラメータが入っていてもこの段落に当てはまります。
具体的な指定は何もありませんが、すなわちモジュール名とアクション名をそのまま何も変更しないということです。

ではルートをカスタマイズしてみましょう。
まずはチュートリアルの通りに

 

1
2
3
homepage:
  url:   /
  param: { module: job, action: index }


と上書きします。
これで、引数が無い場合にはjobモジュールのindexアクションが実行されるということになり、
http://symfony.localhost/frontend_dev.php
http://symfony.localhost/frontend_dev.php/job/index

この両者が同じになります。

更にルーティングを追加。
 

1
2
3
4
job_show_user:
  url:   /job/:company/:location/:id/:position
  param: { module: job, action: show }
  requirements: {id: \d+ }


default:の/:module/:action/*が先に来るとそちらに引っかかってしまうので、default:より先に記述する必要があります。

そして以下のURLでアクセスします。
http://symfony.localhost/frontend_dev.php/job/sensio-labs/paris-france/1/web-developer

urlに:が付く場合は該当するパラメータの内容を表し、付かない場合はURLそのものを表します。
  url:   /job/:company/:location/:id/:position
の場合、
/job/はそのものが必須であり、
http://symfony.localhost/frontend_dev.php/job/sensio-labs/paris-france/1/web-developer
のようなURLには引っかかりますが、
http://symfony.localhost/frontend_dev.php/jobs/sensio-labs/paris-france/1/web-developer
などのURLにはひっかからないということを示します。
/:companyは、その位置に該当するパラメータということで、今回の場合は"sensio-labs"を表します。
このパラメータは、アクション内で$request->getParameter('company')として受け取ることができます。

どのような場合に使うかというと、URLをわかりやすくすることができます。
とりあえず今思いついたものとしては静的ページを配置する場合などに使えるかもしれません。
 

1
2
3
static_page:
  url:   /static/:name
  param: { module: index, action: static }


としてindexActions::executeStatic$this->setTemplate($request->getParameter('name'))とか。

requirementsエントリはリクエストパラメータの絞り込みです。
id: \d+なので、:idの位置に来る値が数値であることを要求します。
当てはまらなかった場合はstatic_page:のルーティングには該当しないということになります。


@を使用したリンクを作成してみます。
url_for('@job_show_user?id=1&position=pos&company=comp&location=loc');
とすると、URLの形式がjob_show_user:のURL形式である、/job/:company/:location/:id/:positionに合致するように変形されます。

@を使わない形式ではurl_forに配列を渡せるのに@を使用するとできないのは何故なんだろう。

長くなったので続きは後日。
これ一時間とか絶対無理だよな。
 
Symfonyの記事一覧

PR


2009/12/21 22:47 | Comments(2) | TrackBack(1) | PHP

トラックバック

トラックバックURL:
前回の続き。 ここまではリンクの書き方とrouting.ymlで完結していました。 ここまでは単にURLとルーティングをマッチングさせているだけなのでまあわからないこともないです。 この後突然ルートクラスという単語が登場し、全然意味がわからなくなってしまいます。 個人的には、下記のように一カ所を変更したいと思う度に至る所を修正しなければならない作りが正しいとはとても思えないんですがどうなんですかね。 まずsfRequestRoute。 こちらは通常ルーティングで使われるはずの...
弱小PHPerの憂鬱 | 2009/12/25 20:26

コメント

Doctrine::getTable('JobeetJob')->find(array($request->getParameter('id')));
これを、分解して解説しているところは、感服いたしました。
他にも、"Practiacal symfony" を読んで違和感を覚えたところが絶妙に解説されていて、非常にスッキリします。
終わりまで続けてください。
posted by TomTom URL at 2010/02/05 13:56 [ コメントを修正する ]
コメントありがとうございます。

基本的に、自分がPractical symfonyを読んで意味がわからなかったところを調べただけ、という内容なのですが、お役に立ったようであれば幸いです。

実はストックが尽きたのでしばらくは別の話になる予定です。
Symfonyはネタがたまったらまた再開します。
posted by NurseAngel at 2010/02/05 22:56 [ コメントを修正する ]

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<ネットワークスペシャリスト試験合格発表 | HOME | 買ったものリスト 2009/12/20>>
忍者ブログ[PR]