Archive for the ‘MAMP’ Category
jobeet5日目 ルーティング
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さんに質問してみようと思います。
関連する投稿
MAMPにて、異なる2つのバージョンのsymfonyを扱う方法
shimaです。
今回は同一マシン上で2つ(以上)のバージョンのsymfonyを簡単に扱う方法を取り上げます。
以下はLeopard環境にインストールしたMAMPでの例となります。
同時に発生する異なるプロジェクト
普段使用しているMacBookの開発環境上で2つのバージョンのsymfonyが必要となりました。
ひとつは普段開発している公開webサービスで稼働しているsymfony1.0.20。もうひとつは、jobeet学習用のsymfony1.2.xです。前者のwebサービスは現在安定稼働しておりますが、1.2.xにバージョンをあげる為には多少なりともリファクタリングが必要であり、おいそれとアップデートする訳にもいかない為に開発環境もそれにあわせる必要がありました。また学習用のjobeetはsymfony1.2に対応しているため自ずと1.2.xが必要となります。
さてMAMPの中に異なるsymfomyを複数インストールするにはどうしたものか?とgoogle検索しながら考えていたところ、makiさんが「簡単ですよ。MAMPを2つインストールすればいいんですよ」と。。
あ、、、なるほど。
まあ、それはそうだ。それぞれのMAMP下に異なるsymfonyをインストールすればよいし、httpd.confやphp.iniもそれぞれのプロジェクトにあわせた設定を施す事が出来る。ちょっとずるい感じもしたが、今使用したいバージョンのsymfonyが入っているMAMPのディレクトリ名を「MAMP」に、今使用しない方のMAMPのディレクトリ名を「MAMP1.0.20」とか適当にリネームするだけで難しい事はいっさい必要なし。これだ!!
かくして同じマシンに、“簡単”に複数バージョンのsymfony開発環境が実現できました。
リネームすらめんどくさい
しかし人間、怠惰な生活を送っているとちょっとしたことが面倒くさく感じてくる訳です。
バージョンを切り替える際に、GUI上でMAMPのディレクトリ名を2つ書き換えると、カーソルがフォーカスしてから入力出来る迄に約1秒。入力に0.5秒。それをもう一回繰り返し。フォーカスに失敗してダブルクリックなんかしちゃうとフォルダが開いちゃったりして、またもう10秒ぐらいかかったりします。(あと、ちょっとイライラが増加)
そこでシェルスクリプトにすることにしました。
#!/bin/bash if [ -e "/Applications/MAMP1.2.4" ]; then mv /Applications/MAMP /Applications/MAMP1.0.20 mv /Applications/MAMP1.2.4 /Applications/MAMP sudo ln -s -f /Applications/MAMP/bin/php5/lib/php/symfony/data/bin/symfony /usr/bin/symfony elif [ -e "/Applications/MAMP1.0.20" ]; then mv /Applications/MAMP /Applications/MAMP1.2.4 mv /Applications/MAMP1.0.20 /Applications/MAMP sudo ln -s -f /Applications/MAMP/bin/php5/bin/symfony /usr/bin/symfony fi open -a /Applications/MAMP/mamp.app exit 0
手作業をスクリプトにしただけですのでたいしたことはやっていません。
上記の例の場合ですが、現在「MAMP1.2.4」というディレクトリがあるばあいは1.0.20が動いている(「MAMP」ディレクトリになっている)とみなして、「MAMP」を「MAMP1.0.20」にリネーム、「MAMP1.2.4」を「MAMP」にリネームしています。symfonyの実行パスがそれぞれ異なっていたため、都度シンボリックリンクを張り直しています。
ついでにですが、最後にMAMPを立ち上げています。
このスクリプトを適当なファイル名、xxxx.shで保存してterminalから実行すれば一瞬でディレクトリが切り替わり、実行されるsymfonyのバージョンも切り替わります。ただ、起動中のMAMPがある場合は一旦それを終了させる必要があります。(終了させるコマンドがよくわかりませんでした・・)
.app形式にしてワンクリックで!
さて少し欲が出ました。
先ほどのシェルスクリプトをアプリケーション形式にしてしまえば、ワンクリックで切り替えられますね。
この際勢いでやってしまいましょう。
基本はこちらのサイトを参考にさせていただきました。
ただアイコン画像の透明化だけ私の環境でうまくいかなかったので、tiff2icnsを使わずにIcon Composerを使用しました。
適当なicon画像を制作して、dockへ。ワンクリックでバージョンが入れ替わる。
Quicksilverでの起動もよし・・・。ただそこまで頻繁に切り替える訳でもないですが。。
シェルを.app形式にするだけでも、便利な感じがしてしまうのでした。
Quicksilverなどのランチャーソフトと併用するのがオススメです。
