Home

Shin x blog

ドキュメント勉強会を7月か8月にやります

この記事の所要時間: 231

[2009/07/07 追記]
受付を開始しました。ご参加お待ちしてますー。
http://atnd.org/events/1020

ドキュメント勉強会を大阪で7月か8月にやります。

上流工程の勉強会って

開発言語やオープンソース系の勉強会は多くあるのですが、要件定義やドキュメント作成、チームマネージメント等々のいわゆる上流工程の勉強会は関西ではあまり聞きません。(私が知らないだけかもしれませんが)

こういったスキルを付けたい場合、それなりの企業に属していれば社内にノウハウが貯まっているので、そこから学ぶのが通常でしょう。ただフリーランスで動いている人やウチのような小さな小さな会社だとそうもいかず独学で学ぶしかないわけです。

勉強の教材としては、雑誌や書籍になるわけですが、これがエンタープライズ向けの記事(PG100人!とか)が多くて、ウチがやっているような~数人月程度の案件にはオーバースペック過ぎなわけです。もちろんエッセンスは頂いて活用するのですが、何だかしっくりいかず、結局「えいやー」で開発してしまうこともありました。

先日、こういう悶々とした思いをTwitterで吐きだしたところ、他にも悶々としている人がいたので、それならということで勉強会を開催します。

ざっくりの概要

今回はドキュメント勉強会ということで、システム開発のドキュメント(主に仕様書)がテーマとなります。

形式はIT勉強会で一般的な発表形式で考えていますが、参加者が少ないようであれば、各々がネタを持ち寄って、みんなで情報交換したり、ディスカッションしたり、といった交流メインの場でも良いと思います。

対象者は「システム開発ドキュメントに関わる人」です。おそらくシステムに関わる人はほとんどが対象にはなるでしょう。ドキュメント作る人はもちろん、ドキュメントを読んで開発している人や、ドキュメントを提出(納品)される人(クライアントさんとか)なんかも対象となります。

開催の流れとしては、平日(週末?)夜に大阪市内の会議室等で2時間ほど勉強会をして、その後懇親会という形ですね。

候補は、7/17(金)、7/24(金)、8/6(木)あたりで考えています。

ドキュメント話しませんか?

参加してみようかな、という人はblogコメントやはてブやTwitter/Wassr等々で反応して下さい。さらに発表者絶賛募集中ですので、発表したい!、せっかくだし発表しても良いかなー、という方も是非是非ご連絡下さい。

レスポンスを見て、内容と会場を決めよう思うので、よろしくお願いしますm(_ _)m

開催内容、受付方法が決まりましたら、またこのblogで告知しますのでお待ち下さい。

ドキュメントについて、あーだこーだと言いたい人、他の人がどうやっているかを知りたい人、1000人月の案件は良いから1人月のドキュメントを書きたい人、一緒に情報共有して、ドキュメントについて語り合いましょう。

お待ちしてます。

勉強会に思うこと

この記事の所要時間: 73

勉強会カンファレンスが行われるなど、俄然盛り上がっているIT系勉強会について最近思っていることをつらつらと。

勉強会に関わっている色々な人の考えを見たい、聞きたいので、これ読んでムズムズ来た人は是非エントリを書いてくださいm(_ _)m

[2009/07/02] ムズムズした人を追記しました。

勉強会歴

まず自分の勉強会歴から。

IT系勉強会に積極的に参加し出したのは2年くらい前からです。それまでも散発的に気が向いたら参加するという感じでしたが、完全にお客様状態でふらっと行って話だけ聞いて帰るという感じでした。

転機は以前エントリにも書いた東京で行われたPHPセミナーでした。shimookaさんに会いに行くという目的で上京したのですが※1、平日夜のセミナーに新幹線とんぼ帰りでわざわざ参加した勢いと実際に成し遂げた達成感が、自分の中の何かを動かしたのかもしれません。

振り返ってみると、このイベントではCakePHPコミュニティでご一緒させて頂いているyandoさんとの出会いもありましたし、自分にとっては運命的なイベントでした。

さて、そんな感じで勉強会への関わりがはじまっていくわけですが、そこを書き出すと長くなるので、略で。

この2年間で、主にPHPやCakePHPの勉強会に参加したり、運営したり、司会したり、発表したり、主催したりと、いちおうひととおり経験してきました。

勉強会カンファレンスを運営されているような「勉強会の達人」的な人間では全くもって無いのですが、勉強会に関わっている一人として書いていきます。

「勉強会って何が得られるの?」

言い回しは人それぞれですが、よく言われます。かつ自分でもよく自問自答します。

ただ参加するだけでも時間を使うわけですが、運営や発表に関わると準備等々でさらに多くのリソースを割くことになります。それだけリソースを投入するわけですから、それなりのリターンが欲しくなるのが人情です。

私自身は根底に「楽しい」があるので、まあそれが原動力になっているのは間違いないです。

さらに分かりやすい利としては以下が考えられます。(というか享受しています)

  • 技術力向上
    参加しただけでもそうですが、発表となるとそれなりに調べてまとめるのでより深く理解が進みます。
  • 情報収集
    発表や懇親会で色々な情報に触れられるので視界が広がります。自分の場合、同じ情報でもWebで見るだけより人に聞いた方がより頭に残るのでこれは有難いですね。
  • 仕事のやり方を学べる
    イベントを皆で運営していると、知らず知らずの内にその人の仕事の進め方のクセのようなものが出てきます。メールの書き方や会場探し、発表者との交渉等々。。。これがとても勉強になります。特にフリーランスや小さな会社で少人数で仕事をしている人にとっては良い教材になるかと。
  • 人前で話すのに慣れる
    まだまだですが、前よりは慣れました。場数こなせばなんとかなる感触はあります。まあ今はより上手く話せるように、という悩みが出てきましたが。:-D

ちなみに私の場合、最も分かりやすい成果としては「本を出せた」ということです。3冊もの本に関われたのは勉強会無くしては考えられませんでした:-D

名前

「勉強会って難しそう」

これもちょくちょく聞きます。「勉強」という言葉が強いのか、塾のようにガリガリ皆で勉強する会を想像する人が多いようです。

もちろん会によってはそういったものもあって、ハンズオンセミナーや読書会といった類は「勉強」色が強い印象があります。

ただ普段やっているPHP系勉強会はそんなにかたい雰囲気ではなく、どちらかというとその技術に関わる人で楽しもう!というノリが強いですね。内容も発表者が持ち寄った内容を発表して、それを聞くだけなので、「勉強会」というより「発表会」といった方が正しいと思います。

あと懇親会なんかを考えると「交流会」というのもありますね。

まあ「発表会」だと学校や幼稚園なイメージですし、「交流会」だとビジネスっぽいイメージがあります。さらに「セミナー」とかにすると「壺売られそう」な印象もあるので、結局「勉強会」に落ちついてしまうのですが。

ここは何か考えたいところです。(単純にPHP@Kansai、PHP@Osakaとか)

支え

さてこういったコミュニティ活動ですが、その裏には色々な支えがあって成り立っていることを意識しておく必要があります。

会場提供して頂ける企業さんもそうですし、運営、参加する人々はもちろんです。あと少なくとも生活して勉強会に参加する金銭、時間の余裕(を生み出す仕事)は必要です。

でも何より感謝すべきは家族かなーと最近あらためて思います。準備もそうですが、特に休日のイベント参加となるとやはり家族の理解が不可欠なわけです。

いつもありがとう!

とりあえず

うだうだと書いてますが、最近勉強会との関わり方というか距離感を模索しているとこなので、吐き出してみました。

かなりチラ裏な内容ですが、まあ現時点ではこんな事を考えていたということで残します。

※1 関西在住なので

[2009/07/02 追記]

ムズムズきた方のエントリをまっちゃさんメソッドで。

・shinoiさん

技術の勉強会は前回のCakePHP勉強会が初めてでしたが、デキル人の顔を見て声を聞いて事例を知ると、凄い刺激になりました。なんだろう、ネットにある情報は触れられないけど、勉強会では三次元的に知ることが出来たような。

http://twitter.com/shinoi/status/2400365429

デキル人のオーラって伝播しますね。色々なところを刺激されます。

・MugeSoさん

セミナー=壺売られそう なるほど。

http://wassr.jp/user/mugeso/statuses/j5224OwUOY

自分も思ってましたし、実際に言われました><

・ますさん

やっぱり趣味みたいな感じに捉えてもらって諦められるってのがコツなんでしょうか(釣りとか、そういうノリ)。

http://wassr.jp/user/masugata/statuses/ryvedc8cgo

家族に理解してもらうのは不可欠ですが、なかなか大変ですね。やっている事を見せると少し安心して貰えるかも。

・パントさん

どんな奥さんだよw

http://wassr.jp/user/pantomime/statuses/gOmeoqstmo

良い奥さんでしょ:-D

・yandodさん

こういうのも書きたいおもいつつメモくらいしか書けていない。最初はノッキンさんでやったやつで id:akiyan も居たときでしたね たしか

http://b.hatena.ne.jp/yandod/20090630#bookmark-14304467

なんかもやもやしていたので勢いで書きました。最初はPHPセミナー(2007/01)ですね。ノッキンさんのは2007/07のやつです:-D

・まっちゃさん

すべての人に感謝ですね、本当にすべての人に感謝です。

http://d.hatena.ne.jp/ripjyr/20090630/1246362392

はい。本当にそうですね。甘味が食べたいです:-D

・re_shikajiroさん

勉強会ってだれが喜ぶためのものだろう?

http://d.hatena.ne.jp/re_shikajiro/20090630

勉強会には色々な形があると思いますが、この視点は大事ですね。

・slywalkerさん

あの人良い>あの人悪い>>>>>|超えられない壁|>>>>>あの人誰?

http://d.hatena.ne.jp/slywalker/20090701

これ、ホントそうですよね!とりあえず知ってもらわないとどうにもなりません。

・まなめさん

今は知識もそうですが、同じものに向上心を持つ人との交流がメインですね。

http://homepage1.nifty.com/maname/log/200907.html#010759

隣の人が実は有名人!って後で意味なく焦ります:-)交流大事です、はい。

CakePHP core.phpの設定をbootstrap.phpに書く

この記事の所要時間: 136

CakePHPでDebug Levelなどの設定を変更する際は、core.phpを修正するのが一般的です。インストール直後にSecurity.saltを変更するのはお馴染みですね。

そんなcore.phpですが、実はこの設定はbootstrap.phpに記述してもokです。例えば以下のようにDebug Levelをbootstrap.phpに記述するとDEBUG=0として動作します。

[app/config/bootstrap.php]

Configure::write('debug', 0);

coreはそのままで、差分をbootstrapに

この方法で何が嬉しいかと言うと、デフォルトの設定をcore.phpに残したまま、変更すべきものだけをbootstrap.phpに書くということができるという点です。

変更したものがはっきり分かりますし、元の設定がどうだったかをすぐに確認することができます。

[app/config/bootstrap.php]

// デフォルトから変更する値だけ記述
Configure::write('debug', 2);
Configure::write('Session.cookie', 'sid');
Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9');

設定書くならbootstrapで

最近は、core.phpからの変更点のほか、アプリケーションで利用する定数なんかもbootstrap.phpにガシガシ書いていっているので、設定を見る、触るなら、まずここという方針が固まってきました。

bootstrap.phpは意外と使っていない人も多いようなので、活用して見て下さい。

7/25にCakePHP Cafe LiveTalkを行います。

この記事の所要時間: 118

CakePHP1.2ガイドブック刊行記念イベントとしてトークイベントを行います。

「CakePHP Cafe LiveTalk」

安藤祐介×岸田健一郎×新原雅司

  • 会場:ジュンク堂書店 池袋本店(TEL:03-5956-6111) 4F喫茶にて。
  • 日時:7/25(土)19:00~
  • 入場料:1,000円(ドリンクつき)
  • 受付:1階 案内カウンターにて。電話予約承ります。

安藤さん岸田さん、新原の3人で、CakeFestやら、CakePHP本やら、CakePHPやらについてお話する予定です。

CakeFest開催後のイベントとなるので、現地に行かれる安藤さんのお話はフレッシュでとても楽しみです。もちろん岸田さんも私も負けじとCakePHP話を繰り広げるつもりですよ。

普段の勉強会とはまた違った雰囲気のイベントとなるので、日頃聞けないような話が飛び出すかも:-D

参加される方はジュンク堂池袋本店1F案内カウンターにてお申し込み下さい。また遠方の方などお申し込みに行けない方はTELにて予約できるそうですので、ご確認下さいませ。

[2009/06/16] まだ受け付け開始していないようです(id:cakephperさん情報ありがとうございました!)。受付開始後にご案内しますので、お待ち下さい。

[2009/06/19] 受け付けを開始しました。ふるってご参加下さい:-D

イベント後は有志による懇親会なども企画しているので、夏の夜にみなさんで盛り上がりましょう!

CakePHP1.2ガイドブックが出ます

この記事の所要時間: 10

一部でお待たせしていましたCakePHPガイドブックの1.2版が今月下旬に発刊されます。

表紙が青になっているのがポイントですね:-D

この本では、単に1.2対応としただけでなく、章によっては全面書き直しや新機能の加筆といった作業を行ったので、ガイドブックからは50P増になりました。

1.2では多くの機能が盛り込まれており、この1冊で全てを網羅することは難しいのですが、ガイドブックにあった「導入」「実践」「応用」の流れはそのままに、必要な情報を取捨選択して1冊にまとめました。

CakePHP初心者の方から中級・上級の方まで参考になる本となりましたので、是非手に取って頂ければ嬉しいです。

前作のCakePHPガイドブックは私自身初めての書籍ということで思い入れの強い本でした。その続編である本書を書く際はこの1年半を振り返る意味でも有意義なものでした。

一緒に執筆した堂園さん、安藤さんには、、、、、、、、

と、言った話をするトークイベントを7/25に池袋ジュンク堂さんにて行います。こちらも楽しいイベントになりそうなので、ご参加下さいませ-。

イベントについてはこちらで。

CSS Nite in Osakaで感じた勉強会との違い

この記事の所要時間: 325

6/10にアップルストア心斎橋で行われたCSS Nite in Osaka Vol.16に参加してきました。

近頃はもっぱら技術系(というかPHP系)の勉強会にしか参加していないので、デザイナーさんのイベントに参加するのは新鮮でした。あと運営、発表に全く関わっていないイベント参加が久しぶりだったので、気楽に行ってきました:-D

参加して率直な感想は「楽しかったー」です。特に懇親会ではテーブルでご一緒した方々がノリが良い方ばかりだったのでとても楽しい時間を過ごせました:-D

主催の秋葉さんをはじめ運営スタッフの皆さんありがとうございました。

実際に参加して、普段の技術系勉強会とは違うというか新鮮だった箇所が色々とあったので、今後のためにメモです。

1. 女性率が高い!

アップルストアには20:00頃に着いたのですが、会場に入ってすぐに感じたのが女性率の高さでした。その場は3、4割くらいが女性だったかと。普段は「N割」で出すのが難しいほど女性が少ないので、これは新鮮でしたね。

懇親会では少し減りましたが、それでも2,3割くらいでしょうか。同じテーブルにいた方に聞くと他のWebのイベントでは半々くらいで、昨日は少ない方だそうです。

2. 資料と説明が丁寧

発表は後半の2つしか聞けなかったのですが、どちらもスライドが見やすくキレイに作られていました。また発表でも、技術的な内容はかみ砕いて丁寧に話されていたので印象的でした。

勉強会の発表では持ってきたネタを披露するというイメージがあったのですが、昨日はセミナーや学校のように「解説する」「教える」といった内容だったように感じました。

このあたりは有料版イベントからの流れがあるのかもしれません。

懇親会でスピーカーの方と少しお話ができたのですが、資料に関しては本業の見せ所だから張り切る、との事でした。これは確かにそうですね:-D

3. 運営が整っている

整っているという表現が的確かどうか分かりませんが、砕けて言うと「プロい」と感じました。

これも有料版を開催されているのと関連があるのかもしれませんが、運営がとてもスムーズで慣れている感じがしました。勉強会に見られる有志の集まりというより、ライブイベントのイベンターとお客さんというな感覚でした。

主催の秋葉さんの進行をはじめ、じゃんけんゲームや次回の予告、懇親会の仕切り、最後の見送り(!)などのおかげで気持ち良く参加できました。これは本当に勉強になりましたね。

4. 交流が活発

懇親会はバーのような場所で動きやすかったのもあります(場所重要!)が、皆さん積極的に名刺交換などされていましたね。負けじ(?)と名刺が無くなるまで名刺交換に勤しんでいたのですが、自己アピールを熱心にされる方が多かったように感じました。

勉強会では自己アピールはそこそこで、技術ネタや発表ネタなどで盛り上がる方が多かったので、この違いは面白かったですね。

5. 職種がバラバラ

デザイナーさんはもちろんですが、ライターさんとかディレクターさんなど色々な職種の方がいました。あと意外に技術者の方も多かったですね。そういう意味ではお互いが何者か(職種すらも)分からないので、↑の自己アピールに繋がっているのかもしれません。

勉強会では技術者がほとんどですが(まあネタがネタなので当たり前ですが)、Web制作においてはどれもが重要なので、PHPのイベントでも技術者では無い方と交流できるようなものをやりたいなあと改めて思いました。

世間は狭い

知っている人が誰もいない状況でひっそり参加申込をしていたのですが、ここの人が参加申込をしていたり(実は以前も参加されているそうです:-D)、Cake勉強会でご一緒した方が運営に参加されていたり、以前の懇親会でご一緒した方と数年ぶりに再会したりと関西ならではの狭さを感じました。

せっかくそんな狭い中にいるわけですから、職種に関係無く一緒に何かできたら嬉しいですね。色々とアイデアも貰えたのでまたイベントを考えます!

ああーまた行こうかな:-D

CakePHP 目で見るフックメソッド

この記事の所要時間: 146

第2回CakePHP関西勉強会でやったデモをこちらでも。

CakePHPには色々なフックメソッドがあるのですが、それらがどのタイミングで呼ばれるかを一覧できるようにデモを行いました。懇親会やアンケートでも良かったよ、と意見を頂いたので、簡単に画面のキャプチャを並べます。

1. Controllerのフックメソッド

Controllerのフックメソッドを並べています。index()はアクションメソッドなので、ここで表示されているフックメソッドは3つです。

ソース

<?php
class DemoController extends AppController {
  public $uses = array();

  public function index() {
  }
}
?>

フックメソッドの並び

2. Componentのフックメソッド

Controllerの$componentsを設定して、ControllerとComponentのフックメソッドを表示しています。赤色になっているのがComponentです。ControllerとComponentのフックメソッドが絡み合って実行されているのが分かりますね。

ソース

<?php
class DemoController extends AppController {
  public $uses = array();
  public $components = array('Demo'); //<---追加

  public function index() {
  }
}
?>

フックメソッドの並び

2-1. Componentを複数定義

Controllerの$componentsでComponentを複数設定すると各々のフックメソッドが順に実行されます。また実行される順は$componentsで記述した順序となります。

ソース

<?php
class DemoController extends AppController {
  public $uses = array();
  public $components = array('Hoge','Demo'); //<---追加

  public function index() {
  }
}
?>

フックメソッドの並び

3. Helperのフックメソッド

さらにControllerの$helpersを設定して、ControllerとComponentとHelperのフックメソッドを表示しています。Helperのフックメソッドは青色です。Helperはビューで利用されるので、後半に集中しています。

ソース

<?php
class DemoController extends AppController {
  public $uses = array();
  public $components = array('Demo');
  public $helpers = array('Demo'); //<---追加

  public function index() {
  }
}
?>

フックメソッドの並び

まとめ

個々のメソッドは知っていても、あらめたてこうして俯瞰して見るとなかなか面白いです。全体の流れが見通せるので、どこに何を書くべきか迷ったときは参考にしてみて下さい。

第2回CakePHP関西勉強会も盛り上がりました&発表資料

この記事の所要時間: 345

第2回CakePHP関西勉強会が終了しました。


photo by zatsu

前回からは半年程経っているのですが、関西もまだまだアツいです。主催ということで、司会もやりつつ発表もしつつとなったのですが、開始からopening、自己紹介、自分の発表と初めの1時間ほどは喋りっぱなしになって、ちょいバテました:-D

他の勉強会でも主催の方はこういう状況になりがちなので、次回以降は順番等を練りたいですね。

今回の発表ではフックメソッドについて話しました。内容はフックメソッドの紹介と呼び出し順を見える化したデモなのですが、特に最後に触れた認証系のフックメソッドの呼び出し順を気にかけて貰えれば嬉しいです。さらに良い使い方があれば是非教えて下さい。

発表資料をアップしておきます。

フックメソッドを極める

View more presentations or Upload your own.

以下、いつものようにつらつらとメモ書きです。

1. フックメソッドを極める

  • shin1x1
  • まあ早い話がslywalkerさんの前節ですよ(冗談):-D
  • フックメソッドは便利なので、オススメです
  • 色々とアドバイスを頂いた(嬉)ので次に生かします!

2. 究極のコントローラを目指す

  • slywalkerさん
  • リファクタリングの様子を発表=>これは分かりやすい
  • リファクタリングでコードが消えていくエフェクトが面白い!
  • ちょうど社内でもコードの見直しをしているのでタイムリーでした。
  • AppControllerにアクションメソッドはさすがにやり過ぎかも:-)

3. RubyOnRailsからCakePHPへ

  • yabumaruさん
  • Rails to Cakeの道はかなり興味津々
  • RubyとPHPの状況から
  • さすがどちらも知っている人の話は参考になる
  • Rails苦行w
  • やっぱり手軽に使えるのがCakeの利点
  • Railsの application.rb が application_controller.rb
  • candycaneでもRailsコードを見ているので勉強になるシーンが多々
  • まさかのCakePHP稼働案件公開!
  • この事例だけで発表ネタいけますよ:-D

LT1. CakePHPでこんなの作ってみました

  • msngさん
  • 元先生!
  • Cakeを使う経緯から、Cakeで開発したサービスの紹介を
  • パパッとサービスが作れるのもCakeの特徴ですね
  • 軽妙でLTらしいトークが楽しかったです:-D

LT2. CakePHPでPDFを出力してみる

  • keisonさん
  • PDF出力をコードを交えて
  • 私は素直にPDFlib使っちゃってます:-D
  • 外部ライブラリの使い方はPDFに限らずに参考になりますね

LT3. plugin の名前と URL がキモいのを何とかする

  • pm11opさん
  • 名前の由来がw
  • PluginのURLのキモさは感じていたので共感:-D
  • 端々に他の人の発表を紹介する心配りがにくいですね
  • ネタ的にはもう少し掘り下げて、発表枠でやっても面白そうです!
  • Core弄りは黒魔術
  • Piza!Piza!

懇親会

  • 関西勉強会ではお馴染みのオシャレ韓国料理屋さん
  • 遅い時間からお世話になりましたm(_ _)m
  • ちょろちょろうろうろしてました
  • 人は意外なとこで繋がっているとか
  • 実装思想のアツい話とか
  • うなぎ饅頭のフリ忘れていたとか
  • キャパが少なくてゴメンナサイとか
  • Pieceとか
  • フレームワークとの付き合い方とか
  • rhacoとか
  • Perlの勉強会もお邪魔します!
  • 色々な方とお話できました
  • とにかく盛り上がったので良かったです:-D
  • ああー今日は最後の麺が無かった

次もやりましょー

実はここ数日、個人的に色々とあってなかなか大変な状況だったのですが、無事に勉強会が開催できて良かったです。

次回については詳細は未確定ですが、もう少し大きめの会場でやりたいと考えているので、ぜひ皆さん発表の準備をしておいて下さい:-D

東京から急遽参加して頂いたすずきさんのおかげで無事にust配信を行うことができました。ありがとうございました!

参加された皆さん、発表者の皆さん、運営のみんな、本当にお疲れ様でした&ありがとうございました。次回も盛り上げていきましょー!!

CakePHP フレームワークのソースをapp/で置き換える

この記事の所要時間: 135

こないだのCakePHP勉強会でやったネタですが、需要がありそうなんで書きます。

CakePHPは1.2Finalになって色々と改良が成されて拡張性も増えたのですが、良くなってきた分、さらに色々とやりたくなるのが人の常です。そこでフレームワークのソースをどうしても書き換えたい時にcake/を触るのではなく、せめてapp/でフレームワークソースを置き換えましょう、という話です。

[目標] ConnectionManagerをapp/に置く

デモではDispatcherの置き換えをやったのですが、cake bake diaryさんのエントリのように需要があるかもなので、ConnectionManagerをapp/に置いてフレームワークに読ませようと思います。

1. ConnectionManagerのソースをapp/以下にコピー

ConnectionManagerを一から書いても良いのですが、それも大変なので、まずフレームワークのConnectionManagerのソースをapp/以下にコピーします。

ConnectionManagerはcake/libs/model/connection_manager.phpになるので、それに倣ってapp/modles/connection_manager.phpにコピーします。

$  cp -a cake/libs/model/connection_manager.php app/models/

2. ConnectionManagerのソースを変更する

app/にコピーしたConnectionManagerを変更します。ここでは読み込まれたソースが分かりやすいように先頭にファイルパスをvar_dump()しておきます。

[app/models/connection_manager.php]

<?php
var_dump(__FILE__); // <---追加
/* SVN FILE: $Id: connection_manager.php 8120 2009-03-19 20:25:10Z gwoo $ */
/**
 * Datasource connection manager
 *
 * Provides an interface for loading and enumerating connections defined in app/config/database.php
 *
 * PHP versions 4 and 5

&#91;/php&#93;
<h3>3. ConnectionManagerをフレームワークに読ませる</h3>
<p>最後にapp/のConnectionManagerをフレームワークに読み込ませます。これにはApp::import()のキャッシュ機能を使います。</p>
<p>方法は簡単で、bootstrap.phpに以下のように書くだけでokです。</p>
<p>[app/config/bootstrap.php]</p>

App::import('Core', 'ConnectionManager', array('file' => '../app/models/connection_manager.php'));

ブラウザからアクセスすると下のように画面上に2.で書いたパスが表示されて、[app/models/connection_manager.php]が読み込まれているのが分かります。

あとはこのソースをガシガシ書き換えていけばokです。

いざという時使えるかも

少しトリッキーな方法ですが、フレームワークのソースを書き換える手段としては覚えておいて損は無いと思います。

ただし、この方法はApp::import()の機能を利用しているので、フレームワークがApp::import()で読まないソース(Objectとか)は残念ながら使えません。あしからず。

CakePHP routes.phpの確認はユニットテストで

この記事の所要時間: 423

第4回CakePHP勉強会@Tokyoでakiyanの男前な発表があったので、今後急増するであろうroutes.phpを極めていく人にオススメな確認方法をご紹介します。

routes.phpの確認にはユニットテストをオススメします。

routes.php設定でありがちなループとして、

  • routes.phpを設定 -> ああ動いた
  • routes.phpに設定追加 -> ああー動かない
  • routes.phpを修正 -> あれ?前動いたところも動かなくなってるorz

というのがあるのですが、せっかくCakePHPにはユニットテスト機構があるのでテストを書いて動作確認をしましょう。

SimpleTestをダウンロードしていない人はダウンロードして、app/vendors/かvendors/に展開しておいて下さい。

routes.phpで設定する目標

Web2.0(最近あんまり聞かないですが。。。)なサイトではありがちなユーザIDを含めるURLを実現します。

URL コントローラー アクション パラメータ
/ TopController index none
/shin1x1 UserController index $params[‘user_id’] = ‘shin1x1’
/shin1x1/edit UserController edit $params[‘user_id’] = ‘shin1x1’
それ以外 NothingController index none

routes.phpを仕様に合わせて設定しておきます。

<?php
  //
  Router::connect('/:user_id/edit', array('controller' => 'user', 'action' => 'edit'));
  Router::connect('/', array('controller' => 'top', 'action' => 'index'));
  Router::connect('/:user_id/*', array('controller' => 'user', 'action' => 'index'));

  // Nothing
  Router::connect('*', array('controller' => 'nothing'));
?>

最後はシステムが取るべきURL以外ならNot Foundを出すように設定しています。これにより想定外のコントローラーやアクションが実行されるのを防ぎます。

テストケースを作る

テストケースは何でも良いですが、とりあえず[app/tests/cases/url_routing.test.php]としておきましょう。スケルトンなソースは以下になります。

当然ながらこれはGREENでとおります。

<?php
App::import('Core', 'Dispatcher');

class UrlRoutingTestCase extends CakeTestCase {
}
?>

テストケースを書く [‘/:user_id/edit’]

まず[URLパターン=’/:user_id/edit’]のテストです。shin1x1がユーザIDとなっています。URLの正引き(URLからコントローラーやアクション、パラメータ等々を決定)はtest_parseParams~()に、URLの逆引き(コントローラーやアクション、パラメータ等々からURLを決定)はtest_url~()に実装しています。

URLの正引きではDispatcher#parseParams()に対象URLを与えて、その戻り値をassertで確認しています。実際の正引き処理はRouterクラスが行うのですが、戻り値の扱いやすさ、分かりやすさを考えてDispatcherを使っています。よりディープなテストをするならRouter::parse()を使った方が良いですね。

↓では[/shin1x1/edit]というURLに対してどのような正引きを行うかとテストしています。

<?php
  public function test_parseParams_user_edit() {
    $Dispatcher =& new Dispatcher();
    $params = $Dispatcher->parseParams('/shin1x1/edit');
    $this->assertIdentical('user', $params['controller']);
    $this->assertIdentical('edit', $params['action']);
    $this->assertIdentical('shin1x1', $params['user_id']);
    $this->assertIdentical(array(), $params['pass']);
    $this->assertIdentical(array(), $params['named']);
  }

?>

次は逆引きです。こちらはRouter::url()にパラメータを設定して、URLを求めています。Router::url()はパラメータからURLを生成するシーン(HelperとかController#redirect()とか)の裏で使われているメソッドなので、ここで求められるURLを確認すれば、実際のアプリケーションの挙動が確認できます。

↓では[controller=’user’、action=’edit’, ‘user_id’=shin1x1]というパラメータからどのようなURLが生成されるかをテストしています。

<?php
  public function test_url_user_edit() {
    $url = Router::url(array('controller' => 'user', 'action' => 'edit', 'user_id' => 'shin1x1'));
    $this->assertIdentical('/shin1x1/edit', $url);
  }

?>

テストケースを書く [‘/’]

以下、同様です。正引き、逆引きをテストしています。

<?php
  public function test_parseParams_user_top() {
    $Dispatcher =& new Dispatcher();
    $params = $Dispatcher->parseParams('/');
    $this->assertIdentical($params['controller'], 'user');
    $this->assertIdentical($params['action'], 'top');
    $this->assertIdentical(array(), $params['pass']);
    $this->assertIdentical(array(), $params['named']);
  }
  public function test_url_user_top() {
    $url = Router::url(array('controller' => 'user', 'action' => 'top'));
    $this->assertIdentical('/', $url);

    $url = Router::url(array('controller' => 'user', 'action' => 'top', 'user_id' => 'shin1x1'));
    $this->assertIdentical('/user/top/user_id:shin1x1', $url);
  }
?>

テストケースを書く [‘/:user_id/*’]

こちらも同様ですね。正引き、逆引きをテストしています。ここではnamedパラメータやQUERY_STRINGも簡易的にテストに入れています。

<?php
  public function test_parseParams_user_index() {
    $Dispatcher =& new Dispatcher();
    $params = $Dispatcher->parseParams('/shin1x1');
    $this->assertIdentical('user', $params['controller']);
    $this->assertIdentical('index', $params['action']);
    $this->assertIdentical('shin1x1', $params['user_id']);
    $this->assertIdentical(array(), $params['pass']);
    $this->assertIdentical(array(), $params['named']);

    $Dispatcher =& new Dispatcher();
    $params = $Dispatcher->parseParams('/shin1x1/');
    $this->assertIdentical($params['controller'], 'user');
    $this->assertIdentical($params['action'], 'index');
    $this->assertIdentical('shin1x1', $params['user_id']);
    $this->assertIdentical(array(), $params['pass']);
    $this->assertIdentical(array(), $params['named']);

    $Dispatcher =& new Dispatcher();
    $params = $Dispatcher->parseParams('/shin1x1/a');
    $this->assertIdentical($params['controller'], 'user');
    $this->assertIdentical($params['action'], 'index');
    $this->assertIdentical('shin1x1', $params['user_id']);
    $this->assertIdentical(array('a'), $params['pass']);
    $this->assertIdentical(array(), $params['named']);

    // namedパラメータ
    $Dispatcher =& new Dispatcher();
    $params = $Dispatcher->parseParams('/shin1x1/page:1');
    $this->assertIdentical($params['controller'], 'user');
    $this->assertIdentical($params['action'], 'index');
    $this->assertIdentical('shin1x1', $params['user_id']);
    $this->assertIdentical(array(), $params['pass']);
    $this->assertIdentical(array('page' => '1'), $params['named']);
  }
  public function test_url_user_index() {
    $url = Router::url(array('controller' => 'user', 'action' => 'index', 'user_id' => 'shin1x1'));
    $this->assertIdentical('/shin1x1', $url);

    $url = Router::url(array('controller' => 'user', 'action' => 'index', 'user_id' => 'shin1x1', 'page' => 1));
    $this->assertIdentical('/shin1x1/page:1', $url);

    $url = Router::url(array('controller' => 'user', 'action' => 'index', 'user_id' => 'shin1x1', 'page' => 1, '?' => array('mode' => 'hoge')));
    $this->assertIdentical('/shin1x1/page:1?mode=hoge', $url);
  }
?>

ユニットテストで楽々確認

というわけでユニットテストでroutes.phpをテストしてみました。

routes.phpの設定は凝っていくと色々な事ができて楽しいのですが、複雑にしていくとハマリがちです。特に条件が複雑になると意図せぬルーティングにマッチしてしまうことがままあります。

そんな時にテストを書いておけば、手軽に動作が確認できます。また、設定変更等に伴うデグレも簡単に判別することができます。例えば、冒頭にあるroutes.phpの内容も順番を入れ替えるとルーティングが変わるのですが、こういった事もテストを実行すれば、どのような挙動になっているかをすぐに判別がつきます。

URLルーティングのテストは書きやすいですし、書いていくと病みつきになりますよ。来月の自分のためにもバンバンテストを書いておきましょ-。

Home

検索
フィード
メタ情報

Return to page top