jobeet5日目 ルーティングの設定
4日目をなんなくクリア。しばらく間が空いてしまったけど、また頑張ってやってみる。続いて5日目。
どうやらrouting周りを整備するようですね。
fivestarさんが「routingまわりが変わったよ」と言っていたので気になるところ。
ronting.ymlの書き方
最初はrouting.ymlの記述方法について。
# apps/frontend/config/routing.yml
homepage:
url: /
param: { module: default, action: index }
default_index:
url: /:module
param: { action: index }
default:
url: /:module/:action/*
デフォルトのrouting.yml。
symfony1.0とも変わりなし。
新しいルーティングの追加
company,location,id,positionを明示したURLを作りたいので追加。
次にテンプレートの変更。apps/frontend/module/job/template/indexSuccess.phpにて
# apps/frontend/config/routing.yml
job:
url: /job/:company/:location/:id/:position
param: { module: job, action: show }
自分はurl_for()よりもlink_to()のほうが好き。
これでGETでcompany,location,id,positionをGETで渡したURLを生成することが可能に。
<?php echo link_to($job->getPosition(),'@job?id='.$job->getId().'&company='.$job->getCompany().'&location='.$job->getLocation().'&position='.$job->getPosition()) ?>
例でいうと
http://jobeet/job/show/japan/tokyo/2/desiner
のような感じ。
ふむ、ここまでは特に問題なし。
sfPropelRouteを使うroutingの設定
む、、これは。。
job_show_user:
url: /job/:company/:location/:id/:position
class: sfPropelRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: show }
requirements:
id: \d+
sf_method: [GET]
sfPropelRouteを加えることによってどうなるのだろう。
sfRequestRouteは理解できたのだが。
リクエストとオブジェクトまでも指定して制限しているということだろうか。
表示URL形式の変更
lib/Jobeet.class.phpを作成して上記を入力。
class Jobeet
{
static public function slugify($text)
{
// replace all non letters or digits by -
$text = preg_replace('/\W+/', '-', $text);
// trim and lowercase
$text = strtolower(trim($text, '-'));
return $text;
}
}
public staticでなくてstatic public ってのもいけるんですね。
trim()関数を初めて知りました。
次にlib/model/JobeetJob.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());
}
routingで書くだけで簡単に設定できないのであろうか。
しかもうまくいかない。+がうまく/に変換されない。どうしたものか。
***_slugがうまく通っていないのか。なぜだろう。
先ほどテンプレでつくったlink_to()を変更してみたらうまくいった。
× echo link_to($job->getPosition(),'@job_show?id='.$job->getId().'&company='.$job->getCompany().'&location='.$job->getLocation().'&position='.$job->getPosition())
○ <?php echo link_to($job->getPosition(), 'job_show', $job) ?>
○ <a href="<?php echo url_for('job_show', $job) ?>"><?php echo $job->getPosition() ?></a>
URLからアクションで関連オブジェクトを取得
これはすごい。
public function executeShow(sfWebRequest $request)
{
$this->job = $this->getRoute()->getObject();
/*
$this->job = JobeetJobPeer::retrieveByPk($request->getParameter('id'));
$this->forward404Unless($this->job);
*/
}
URLからオブジェクトを取得するのですね。
モデルから各アクションのルーティングをまとめて設定
これもすごい。
job:
class: sfPropelRouteCollection
options: { model: JobeetJob }
なんともmodelのJobeetJobからアクションを読み込み、自動的に以下のroutingを設定してくれることできる。
"sf_format"というのがちょっと不思議ですが、どうやら6日目で触れるみたいです。
job:
url: /job.:sf_format
class: sfPropelRoute
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: sfPropelRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: new, sf_format: html }
requirements: { sf_method: GET }
job_create:
url: /job.:sf_format
class: sfPropelRoute
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: sfPropelRoute
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: sfPropelRoute
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: sfPropelRoute
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: sfPropelRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: show, sf_format: html }
requirements: { sf_method: GET }
しかし、これは"modelから生成"というよりもアクションから生成されているのだろうか。その辺の詳しいことは未だ分からず。
ルーティング設定を一覧する
コマンドを打つと、routing.ymlの現在の設定を一覧することができる。
$ symfony app:routes
これ、そこまで役立つのかな。とりあえず、覚えておこう。
5日目
結構難しかった。
fivestarさんの言ったとおりrouting周りは変わった印象を受けました。
というかできることが追加されたように感じた。
sfPropelRouteCollectionは今日の衝撃。