ORMはDoctrineによるjobeetプロジェクト、5日目はルーティングです。
現在、ローカルにあるページのURLは、どれも、/job.php?id=1など、意味の分からないものになっていますが、
これらを、/job/show/id/1など、意味のあるURLにして表示させるような設定を学びます。
ルーティングは内部URIと外部URLを管理しますし、リクエストを受け取った時、ルーティングはURLを解析して内部URIに変換します。私も、普段何気なく、routing.ymlというファイルで、URLを設定したりしていますが、URLを適切なものに変換して、”ソースコードの内部構造を分からないように表示させる”、というセキュリティ強化という面もあるようです。(知りませんでした!)
jobeet5日目の内容は、4日目までに作成したページのURLを、意味のあるものに変換する、という作業です。
参考サイトはこちら!
homepageルートのmodule変数の値をjobに変更します
# apps/frontend/config/routing.yml
homepage:
url: /
param: { module: job, action: index }
homepageルートを使うようにレイアウト内の Jobeetロゴのリンクを変更します。
<!-- apps/frontend/templates/layout.php -->
<h1>
<a href="<?php echo url_for('@homepage') ?>">
<img src="/images/jobeet.gif" alt="Jobeet Job Board" />
</a>
</h1>
これで、jobeetのトップページのロゴをクリックすると、jobeetのページにリンクが貼られました。
次に、求人ページのURLを意味のあるものにしていきます。
routing.ymlファイルを編集しファイルの冒頭にjob_show_user`ルートを追加します。
job_show_user:
url: /job/:company/:location/:id/:position
param: { module: job, action: show }
indexSuccess.php内で呼び出されるurl_for()を変更
url_for('job/show?id='.$job->getId().'&company='.$job->getCompany().
'&location='.$job->getLocation().'&position='.$job->getPosition())
ここまでで、jobeetのページは
http://jobeet.kokoro/frontend_dev.php/job/Sensio+Labs/Paris%2C+France/1/Web+Developer
というURLで表示されます。
これを、
http://jobeet.kokoro/frontend_dev.php/job/sensio-labs/paris-france/1/web-developer
という、綺麗にルーティングされたページにしていきます。
全ての非ASCII文字をハイフン(-)に置き換えたカラム値にする(上記の、%2C+、などの記号を全て-にします) JobeetJobファイルを開いて、クラスへ下記のメソッドを追加します。
// lib/model/doctrine/JobeetJob.class.php
public function getCompanySlug()
{
return Jobeet::slugify($this->getCompany());
}
public function getPositionSlug()
{
return Jobeet::slugify($this->getPosition());
}
public function getLocationSlug()
{
return Jobeet::slugify($this->getLocation());
}
lib/Jobeet.class.phpファイルを作り slugifyメソッドを追加します。
// lib/Jobeet.class.php
class Jobeet
{
static public function slugify($text)
{
// 文字ではないもしくは数値ではないものすべてを-に置き換える
$text = preg_replace('/\W+/', '-', $text);
// トリムして小文字に変換する
$text = strtolower(trim($text, '-'));
return $text;
}
}
routing.ymlの、job_show_userルートでバーチャルアクセサで実際のカラムの名前を置き換えます。
job_show_user:
url: /job/:company_slug/:location_slug/:id/:position_slug
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: show }
requirements:
id: \d+
sf_method: [get]
.ymlファイルを変更した後は、symfonyのキャッシュをクリアします。
$ php symfony cc
Jobeetオブジェクトを読み取るためにルートオブジェクトを使うexecuteShow()メソッドを変更します。
class jobActions extends sfActions
{
public function executeShow(sfWebRequest $request)
{
$this->job = $this->getRoute()->getObject();
$this->forward404Unless($this->job);
}
// ...
}
routing.ymlファイルを以下に修正します。
# apps/frontend/config/routing.yml
job:
class: sfDoctrineRouteCollection
options: { model: JobeetJob }
job_show_user:
url: /job/:company_slug/:location_slug/:id/:position_slug
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: show }
requirements:
id: \d+
sf_method: [get]
# default rules
homepage:
url: /
param: { module: job, action: index }
default_index:
url: /:module
param: { action: index }
default:
url: /:module/:action/*
上記のob ルートは実際には下記に示す 7つのsfDoctrineRouteルートを自動的に生成しています。
job:
url: /job.:sf_format
class: sfDoctrineRoute
options: { model: JobeetJob, type: list }
param: { module: job, action: index, sf_format: html }
requirements: { sf_method: get }
job_new:
url: /job/new.:sf_format
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: new, sf_format: html }
requirements: { sf_method: get }
job_create:
url: /job.:sf_format
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: create, sf_format: html }
requirements: { sf_method: post }
job_edit:
url: /job/:id/edit.:sf_format
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: edit, sf_format: html }
requirements: { sf_method: get }
job_update:
url: /job/:id.:sf_format
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: update, sf_format: html }
requirements: { sf_method: put }
job_delete:
url: /job/:id.:sf_format
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: delete, sf_format: html }
requirements: { sf_method: delete }
job_show:
url: /job/:id.:sf_format
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: show, sf_format: html }
requirements: { sf_method: get }
すべてのURLに対してルートを定義してみます。jobルートはJobeetアプリケーションを記述するために必要なすべてのルールを定義するので、 routing.yml設定ファイルからデフォルトのルートを削除もしくはコメントアウトします。
# apps/frontend/config/routing.yml
#default_index:
# url: /:module
# param: { action: index }
#
#default:
# url: /:module/:action/*
ここまでで、jobeet5日目の内容は終わりです。
参考テキストの、「アクションテンプレートにおけるルーティング」の辺りの理解が今ひとつですが、URLのルーティング自体は完了です。6日目以降に、理解不足の部分のシワ寄せが来ないといいのですが。。。。また、私たちが開発しているサイトで、どの辺りを参照すれば良いのか、makiさんに質問してみようと思います。
関連する投稿
リツイートする
