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/config/routing.yml
job:
url: /job/:company/:location/:id/:position
param: { module: job, action: show }
次にテンプレートの変更。apps/frontend/module/job/template/indexSuccess.phpにて
自分はurl_for()よりもlink_to()のほうが好き。

<?php echo link_to($job->getPosition(),'@job?id='.$job->getId().'&company='.$job->getCompany().'&location='.$job->getLocation().'&position='.$job->getPosition()) ?>
これでGETでcompany,location,id,positionをGETで渡したURLを生成することが可能に。
例でいうと
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形式の変更



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;
}
}
lib/Jobeet.class.phpを作成して上記を入力。
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を設定してくれることできる。


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 }

"sf_format"というのがちょっと不思議ですが、どうやら6日目で触れるみたいです。
しかし、これは"modelから生成"というよりもアクションから生成されているのだろうか。その辺の詳しいことは未だ分からず。

ルーティング設定を一覧する


$ symfony app:routes
コマンドを打つと、routing.ymlの現在の設定を一覧することができる。

これ、そこまで役立つのかな。とりあえず、覚えておこう。

5日目

結構難しかった。
fivestarさんの言ったとおりrouting周りは変わった印象を受けました。
というかできることが追加されたように感じた。

sfPropelRouteCollectionは今日の衝撃。