Jobeet 7日目

7日目です。
job(仕事)をカテゴリ別に並び替えることをしました。

sluggable

7日目はページャが主体でしょうか?
ページャは特にこれといったものはなかったけど
それよりDoctrineのschemaのsluggableのほうが気になってしょうがない。

コレ↓

JobeetCategory:
  actAs:
    Timestampable: ~
    Sluggable:
      fields: [name]
  columns:
    name:
      type: string(255)
      notnull:  true

これでデータベースを生成するとslugというカラムが作られます↓

                                                                                                                                        • +
Field Type Null Key Default Extra
                                                                                                                                        • +
id bigint(20) NO PRI NULL auto_increment
name varchar(255) NO NULL
created_at datetime YES NULL
updated_at datetime YES NULL
slug varchar(255) YES UNI NULL
                                                                                                                                        • +

いままでわざわざslugifyしてたのとはおさらばです↓

<?php
// lib/Jobeet.class.php

/* sluggableをつかうので必要なし
 public function getSlug()
  {
    return Jobeet::slugify($this->getName());
  }
*/

?>

で、実際にMVCの連携ではどのようになるかというと
(※今回はカテゴリの詳細へのリンクである。)

・ルーティングルール

#routing.yml

category:
  url:    /category/:slug
  class:  sfDoctrineRoute
  param:  { module: category, action: show }
  options: { model: JobeetCategory, type: object }


・テンプレートからルーティングへのアクセス

// module/job/templates/indexSuccess.php

<?php echo link_to($category, 'category', $category) ?>

↑ちょっとわかりにくいが、

  • $categoryはオブジェクトで、第一引数は__toString()で定義したものの表示がそのままリンク名に
  • 第二引数はルーティングへのアクセス("@"は使わなくてよくなった)
  • 第三引数はオブジェクトをそのままをわたしている(こうすることでURLにパラメータを的確につけてくれる)

ほんで、ルーティングの次はカテゴリ詳細アクション。

<?php
//module/category/action/actions.class.php

  public function executeShow(sfWebRequest $request)
  {
    $this->category = $this->getRoute()->getObject();
  }

↑なんじゃこりゃ!!!って思ったのですが
URLのパラメータから条件しぼってカテゴリオブジェクト取ってきてるっぽい。
(※細かい中身は未調査。。)
要はうまいことやってくれる。
しかしこれは便利というか、、逆にわかりづらいという印象を受けた。

そしてカテゴリ詳細テンプレート↓

// module/category/templates/showSuccess.php(例)

<table>
<?php foreach ($category as $job): ?>
<tr>
<td><?php echo $job->get('name') ?></td>
<td><?php echo $job->get('description') ?></td>
</tr>
<?php endforeach; ?>
</table>

といった感じ。

なんか、なんでも楽にできちゃって、逆に分かりにくくなるんじゃないかな。。と思った。

でも慣れたら簡単かも。