ホーム > タグ > プラグイン
プラグイン
CakePHP開発者が知るべき10のこと
- 2011年3月9日 10:00 AM
- CakePHP

先日、こんな記事が上がっていました。
この記事でまとまっているのは、Android開発において必要な10の項目です。
インターフェースの設計から、データの取り扱いまで。
AndroidはモバイルデバイスのOSで、CakePHPは単なるWebフレームワーク。
しかし、予め用意されたルールやAPIを活用する点は同じです。
つまり、フレームワーク全般において、開発者が知るべきことをまとめることが出来るはずです。
ここでは、私が良く利用するCakePHPフレームワークについて、開発者が知るべき10のことをまとめます。
フォーラムにこの記事を書き込んだところ、shunさんがtipsを追記してくれています!
モデルに、配列を取り入れた経緯などを紹介してくれています。
こちらも併せてどうぞ。
1. CakePHPで良いのか

CakePHPを使う際に、知るべきことその1。
それは、あなたは本当にCakePHPを使うべきなのかということです。
現在、あらゆるフレームワークが溢れ返っています。
- Ruby
- Ruby On Rails
- Sinatra
- Python
- Django
- Pylons
- Juno
- Perl
- Catalyst
- CGI::Application
- PHP
- CakePHP
- Zend Framework
- Symforny
- Lemonade
- Java
- Stuts
- Slim3
これだけあるフレームワークの中で、なぜ、私はCakePHPを選ぶのか。
そもそも、その開発に使う言語は、本当にPHPで良いのか。
なぜ、PHPを使うのか。
例えば、Quoraを立ち上げた、Facebookの元CTOのAdam D’Angeloさんはこんなことを言っています。
PHP was out of the question. Facebook is stuck on that for legacy reasons, not because it’s the best choice right now. Our main takeaway from that experience is that programming language choice is very important and is extremely costly to change.
Why did Quora choose Python for its development?より
少し、古い記事ですが、現在のウェブではこれが現実でしょう。
Google App Engine、Amazon AWS、あるいはその他のPaaS。
環境を用意するのは、昔ほど難しくありません。
そして、コストもさほど高くありません。
私は、”PHP/CakePHPを使うな“と言っているのではありません。
盲目的にならず、その開発がどんなものかを考えて、フレームワーク選ぶべきだと言っているのです。
これは、CakePHPに限ったことではありませんが。
2. CakePHPの癖を知る

CakePHPを使うとして、次に知るべきことはCakePHPの癖です。
特にデータの取り扱い、つまりモデル周りには、癖があります。
>>> from mysite.polls.models import Poll, Choice # モデルクラスを import します。 # まだ Poll は一つもできていません。 >>> Poll.objects.all() [] # 新たな Poll を作成しましょう。 >>> import datetime >>> p = Poll(question="What's up?", pub_date=datetime.datetime.now()) # 出来たオブジェクトをデータベースに保存します。 save() は明示的に呼ば # ねばなりません。 >>> p.save() # これでオブジェクトに ID が割り当てられました。お使いのデータベースに # よっては、この値は "1" ではなく "1L" のときもあります。心配することは # ありません。単にデータベースバックエンドが Python 長整数型で値を返す # ようになっているだけのことです。 >>> p.id 1 # データベースの各カラムに Python の属性としてアクセスします。 >>> p.question "What's up?" >>> p.pub_date datetime.datetime(2007, 7, 15, 12, 00, 53) # 属性を変更して save() を呼び出すとカラムの値を変更します。 >>> p.pub_date = datetime.datetime(2007, 4, 1, 0, 0) >>> p.save() # objects.all() はデータベース上の全ての Poll を返します。 >>> Poll.objects.all() [<Poll: Poll object>]
>> p = Post.new(:content => "A new post")
=> #<Post id: nil, name: nil, title: nil,
content: "A new post", created_at: nil,
updated_at: nil>
>> p.save
=> false
>> p.errors
=> #<OrderedHash { :title=>["can't be blank",
"is too short (minimum is 5 characters)"],
:name=>["can't be blank"] }>
Ruby on Rails Guides: Getting Started with Rails: 6.6 Using the Consoleより
PythonやRubyは、あらゆるものをオブジェクトとして扱います。
そのため、データをインサートする際にも、まず、モデルのインスタンスを生成します。
その後、インサート用のメソッドを呼び出し、インサートを完了させます。
しかし、CakePHPではデータを配列で扱います。
データをインサートする際も、新しいインスタンスを作ったりしません。
function edit($id) {
//POST された form データがあるか?
if(!empty($this->data)) {
//form データが有効で保存できた場合...
if($this->Recipe->save($this->data)) {
//セッションにフラッシュメッセージをセットしリダイレクトする
$this->Session->setFlash("Recipe Saved!");
$this->redirect('/recipes');
}
}
//form データがない場合、編集する recipe を検索し
//ビューに渡す
$this->set('recipe', $this->Recipe->findById($id));
}
3 CakePHPによる開発: 3.7.4 データを保存するより
このことを知らなければ、あなたはforeachと配列の地獄に落ちるでしょう。
CakePHPでは、これをすっきりと記述するためにSetクラスが存在します。
Setクラスを活用し、配列地獄に落ちないように、気をつけましょう。
3. 高速開発手法を知る

せっかく、フレームワークを使うのだから、その資産を利用しましょう。
フレームワークの資産、それはプラグインです。
例えば、あなたがtwitter連携機能を開発しているとします。
必要なのは、あなたの書いたコードでなく、これらのプラグインです。
Facebook連携機能をエンハンスするとします。
さらに、携帯サイトに対応するとします。
これらのプラグインを作り、公開してくれる人はだいたい決まっています。
その人たちを把握しておきましょう。
- 国内
- 海外
順不同、敬称略です。
複数のCakePHPプラグインを公開している方をまとめました。
全てgithubへのリンクとなっているので、フォローしておくと良いでしょう。
4. 学習方法を知る

CakePHPを学ぶ方法を知ることは、あなたのためにも、そしてあなたの周りに居る人のためにもなります。
あなたの作ったウェブサイトを、後輩に引き継ぐかもしれない。
あるいは、新たなCakePHP開発者を追加するかもしれない。
こうした場合に、CakePHPの良い学習方法を知っていると役に立ちます。
対象者が、フレームワーク、それどころかPHPの初心者である場合、CakePHPの公式マニュアルが役に立ちます。
これは簡単なブログ作成のチュートリアルで、初心者でも手軽に始めることが出来ます。
しかし、このチュートリアルには弱点があります。
それは、MVCモデルを活用しきれていないこと。
もし、このチュートリアルだけでCakePHPを学習すると、ひどい目に遭います。
次に、学習すべきはこれです。
モデル側にロジックをまとめることを覚えましょう。
あるいは、hiromi2424さんのエントリも大変参考になります。
CakePHPを利用したウェブサイト開発を一通り学習したいのであれば、この本がお勧めです。
|
CakePHPによる実践Webアプリケーション開発
|
CakePHP v1.2を対象に書かれているため、少し情報が古い可能性があります。
しかし、その点を除いても、大変参考になります。
業務アプリケーションを対象とした開発手順は、とても実践的です。
最後に、話題のTDDをCakePHPでも取り入れましょう。
|
Webアプリケーションテスト手法
|
CakePHP 1.3で標準テスティングフレームワークSimpleTestの使い方が、わかりやすくまとまっています。
5. サイトを高速化する

サイトのアクセス負荷が増えてきたときのために、その負荷対策もCakePHP開発者は知るべきでしょう。
まず、簡単なところから。
CakePHP 2.0でも標準で取り入れられたプラグインです。
モデルの読み込みをマジックメソッドに寄せることで、プログラムのロードを高速化します。
一般的なウェブサイトであれば、全てのページが動的である必要はありません。
まずは、デフォルトのキャッシュシステムを利用しましょう。
しかし、このキャッシュシステムは完璧ではありません。
プログラムのロードが少なくなるだけで、少なからずCakePHPが呼ばれます。
そこで、静的ページには次のプラグインを利用します。
このプラグインを利用すると、HTMLの静的ファイルをwebroot以下に吐き出してくれます。
CakePHPにアクセスしないのだから、爆速ですよね。
モデル側のキャッシュは、デフォルトで用意されているキャッシュ機構を利用します。
これを有効化すると、クエリ毎に結果をキャッシュしてくれます。
ただし、1リクエスト毎のメモリキャッシュである点と、データ更新後の挙動には注意が必要です。
最後に、独自のキャッシュ機構を用意する場合。
Cacheクラスを利用します。
自動でシリアライズをしてくれたり、キャッシュの有効期限を決めれたりと、便利なクラスです。
6. デプロイを自動化する

CakePHPはデプロイが簡単です。
作成したアプリケーションを、ウェブサーバが参照出来る場所に置くだけです。
しかし、長期で運用する場合、色々と問題が生じます。
例えば、一時ファイルの問題です。
CakePHPはデフォルトでも、アプリケーションに支障が出ない範囲で様々なファイルをキャッシュし、一時ファイルに格納します。
そのため、新たなコードやファイルを追加した場合に、この一時ファイルが悪さをすることがあります。
予期せぬエラーが発生する場合、この一時ファイルが悪さをしていることが多いのです。
デプロイの度、一時ファイルを手動で消しても良いのですが、それは面倒です。
そして、ミスも増えます。
デプロイの簡単なCakePHPですが、その処理も自動化しておくと、多くのメリットが得られます。
CakePHPもCapistranoを利用し、デプロイを自動化できます。
もし、CLIに慣れないエンジニア、あるいはデザイナーが周りに居る場合は、Webistranoも良いでしょう。
Capistranoを使えば、簡単にデプロイを自動化できます。
しかし、データベースのマイグレーションが課題として残ります。
CakePHPのスキーマシェルは、とても貧弱です。
デフォルトのアップデート機能では、自動デプロイに耐えることが出来ません。
そこで、CakeDCが公開しているMigrationsPluginを利用します。
このプラグインを利用することで、Ruby On Railsのようなマイグレーションシェルを得ることが出来ます。
マイグレーションアップ、マイグレーションダウンも自由自在です。
7. 継続的インテグレーションを取り入れる

“4. 学習方法を知る“の中で、テストの話に簡単に触れました。
もし、あなたがテストケースを運用し始めたなら、継続的インテグレーションを取り入れましょう。
CakePHPでも、Hudsonを利用することで継続的インテグレーションすることが出来ます。
Ryuzeeさんの記事を見れば、数時間で環境を整えられるでしょう。
8. バリデーションを活用する

CakePHPを利用するのに欠かせない機能。
それはバリデーションです。
マニュアルの例は、とてもシンプルです。
バリデーションには、この他にも様々な使い道があります。
“4. 学習方法を知る“でも紹介しましたが、hiromi2424さんの記事を参考にしてください。
さらに、バリデーションを使うにあたって以下のことを踏まえておきましょう。
- バリデーションは必ずしも、テーブルのフィールドと1対1でなくても良い。つまり、テーブルに存在しないフィールドに対しても、バリデーションを定義出来る。
- 独自バリデーションメソッドの中から、保存予定の全てのデータにアクセス出来る。つまり、Model::$dataプロパティを利用し、複雑なバリデーションも書ける。
- Model::beforeValidate()コールバックを利用することで、オプションによってバリデーションを切り替えることが出来る。
バリデーションメソッドは、様々な可能性を秘めています。
9. エディタを活用する

CakePHPを利用出来るエディタを把握しましょう。
PHPを書くことが出来るエディタであれば、開発に支障はありません。
しかし、専用のプラグインがあるエディタを利用すれば、開発速度が上がります。
個人的に残念なのは、有用なvimプラグインがないことです。
そのうち、個人的に開発したいと思っているので、vimmerの方はしばしお待ちを。
10. 最新の情報を得る

最後に、CakePHPのトレンドを把握するために、必要な情報源を押さえましょう。
- 国内
- CakePHPフォーラム
- 24時間CakePHP
- cakephperの日記
- Shin x blog
- Copy/Cut/Paste/Hatena
- ECWorks Blog
- kanonjiの日記
- 半年前の私への教科書
- 開発メモのようなもの
- トーハム紀行
- kaz_29@はてな
- php-tips.com
- kunitの日記
- akiyan.com
- CakePHP のおいしい食べ方
- candycane development blog
- 海外
全てRSSリーダーに登録しておけば、ばっちりですね。
もし、CakePHPネタをたくさん書いてるのに、載っていない!っていう人が居たら教えてください。
掲載させて頂きます。
かなりの長文になってしまいました。
(そして、最後はヘタってしまいました:(
恐らく、生粋のCakePHP Bakerの皆さんは全て押さえているでしょう。
初級、あるいは中級者の方の参考になれば、幸いです。
また、他のフレームワークでも、”知るべき10のこと“シリーズを書いてみませんか?
1週間でトリビア共有サイト”trivist”を作ってみた
- 2011年1月6日 10:00 AM
- 開発環境
ここのところ、ブログの更新もツイッターのつぶやきも完全にストップしていました。
集中力のない@tfmagicianにしては珍しいことです。
何をしていたか。
こんなウェブ・サービスを作っていましたよ。
実はこれ、作成期間1週間です。
シンプルなサイトなので、恐らく、開発に慣れた人なら1週間は余裕でしょう。
今日は、まだフレームワークを使った開発、あるいはウェブ・サービスの開発自体に慣れていない人に向けて、高速開発に関するtipsを紹介します。
高速開発とは何か考える

まず、高速開発を可能にする”最強最大の魔法“を考えましょう。
それはこれです。
コーディングしない
コーディングしないで、システムが出来ればなんと良いことか!
これはエンジニアにとって、当たり前のことです。
しかし、これを念頭に置くのと置かないのでは、まるで開発速度が違ってきます。
できるだけ、怠慢を考えます。
“面倒だから、俺はコーディングしたくないんだよ!”
これで良いんです。
フレームワークを使う

trivistではフレームワークとして、CakePHPを採用しています。
フレームワークの効果は説明するまでもないでしょう。
様々な機能がパッケージングされており、高速開発を可能にします。
また、フレームワークに乗ることで、複数プロジェクトで利用可能な共通資産が作成可能です。
それが次の”プラグインを使う“です。
プラグインを使う

大抵のフレームワークには、プラグインの機能が備わっています。
このプラグインを活用することで、高速開発が可能です。
例えば、検索エンジン用のサイトマップ。
trivistのように自動でページが増えていくサイトは、自動でサイトマップを生成する必要があります。
MVCのフレームワークを使ったことがある人は、この処理がすぐにイメージ出来ます。
- モデル: id一覧の取得
- コントローラ: id一覧からURLを生成する
- ビュー: サイトマップの吐き出し
こんなところでしょう。
プラグインを知らない人は、この処理をプロジェクト毎に毎回作成するか、コードを前のプロジェクトからコピーするかのいずれかです。
しかし、プラグインを知っていれば、これらの処理をどんなプロジェクトでも使えるように共通化することが出来ます。
共通化したコードは、pluginsディレクトリに放り込むだけ。
あとは、configディレクトリに設定ファイルを書いておしまいです。
これなら、ほとんどコードを書かなくて済みます。
さらに、プラグインがしっかりテストされていれば、アプリケーションにおけるこの部分のテストは、ほぼ省略出来ます。
trivistでは、以下のプラグインを使っています。
- CakePHP-Twitter-API-Plugin
- TagsPlugin
- UtilsPlugin
- SitemapPlugin
- MigrationsPlugin
- DebugKit
- CakePHP-Bitly-Helper
この中で特に強力なのが、CakePHP-Twitter-API-PluginとTagsPluginです。
CakePHP-Twitter-API-Pluginは、TwitterのOAuth認証が2行で書けます。
(自身のユーザテーブルにデータを格納する処理は別途必要ですが)
TagsPluginは、簡単にタグ付けとそのタグクラウドを実装できます。
タグ登録時の分割処理も自分で書く必要がありません。
いつもの感覚でデータを保存すると、勝手にタグ付けして、勝手にタグクラウドを作ってくれます。
UtilsPluginのCsvImportBehaviorも便利です。
と、話出したら止まらないので、ここまでにします。
よくある機能は自分で実装する前に、プラグインを探してみましょう。
ブログパーツを使う

ブログパーツも活用しましょう。
最近のウェブ・サービスで必要となるのが、ソーシャルメディアのコメントを表示する機能と検索機能です。
trivistでは、以下のブログパーツを活用しています。
ソーシャルメディアのコメントを取得するのって、結構面倒なんですよね。
対応するサービス分のコードを書く必要がある。
また、データが膨大に増えていくのも気になります。
Zenbackは、各ページのソーシャルメディアのコメントを自動で表示してくれるブログパーツです。
jsのコードを貼り付けるだけのお手軽実装です。
これで、どれだけ工数が削減できることか。
検索機能は、全文検索に対応させる必要があります。
その上、検索結果のランク付けも必要です。
そこはもう、本業のGoogleさんに任せてしまいましょう。
Googleカスタム検索も導入は簡単。
これで、検索実装からも解放されます。
このように、ソースコードだけでなく、外部サービスも活用します。
アクセスの少ない立ち上げ当初は、これで十分かと。
自動化する

ここまで来たら、サーバも晒します。
- さくらサーバVPS
- OS: Ubuntu 10.04
- メモリ: 512M
- 構成: Apache2, MySQL5, PHP5
さくらサーバVPS標準のCentOSでなく、Ubuntuを使っていることにはいくつか理由があります。
- 最新のパッケージや比較的マイナーなパッケージを、自分でビルドせずに使える
- セットアップスクリプトをUbuntu 10.04用に書き溜めてある
特に大きいのは、2つ目です。
セットアップスクリプトを書き溜めることで、サーバのセットアップを効率化します。
先程の構成を作るには、apache_phpスクリプトとmysqlスクリプトを実行して、設定ファイルを少し変更するだけです。
また、アプリケーション自体のデプロイは、Capistranoのレシピを使います。
CakePHP用のレシピを作ってあるので、それを適用するだけで、自動デプロイ環境が完成です。
サーバ関連の作業で重要なのは、一回こっきりの作業をしないことです。
大抵の作業は、必ずと言っていいほど再び行います。
それを見越して、予め準備しておきましょう。
どうでしょうか。
1週間でウェブ・サービスを立ち上げられる気がしてきましたか。
とにかく、あるモノをとことん利用しましょう。
あなたの欲しいモノは、恐らく世界の誰かがすでに作っています。
せっかく、公開されているのに使わなければ損です。
それが自分の要求を満たさなくても、改造することで自分の要求を満たせないか、考えてみましょう。
自分で作るよりも、そっちのほうが絶対に早いです。
最後に、trivistの応援もお願いします!
うまく起動に乗れば、もっと機能を拡張したいと考えています。
もっと、共有機能を充実して、仲間内で楽しめるサイトになれば、と。
どんなトリビアでも良いので、投稿お願いします。
Gitと一緒にCakePHPを楽しむ – CakePHP Advent Calendar 2010 6日目
- 2010年12月6日 1:00 PM
- CakePHP

これはCakePHP Advent Calendar 2010の6日目の記事です。
CakePHP Advent Calendarって何?という方はこちらへ。
CakePHPに関するtipsを1日1つ、順番に紹介するということなので、私はGitとCakePHPの活用について書きます。
恐らく、これはCakePHPに限らずあらゆるフレームワークで有効なtipsです。
CakePHPを初めとするフレームワークを長く使っていると、色々と面倒なことが起きてきます。
- フレームワークのバージョンアップ
- 外部ライブラリのバージョンアップ
- 複数プロジェクトにおけるコードの共通化
“フレームワークのバージョンアップ“は重要です。
先日、こんなバグも発見されましたしね。
こういったバージョンアップには素早く対処したいもの。
“複数プロジェクトにおけるコードの共通化“も重要です。
例えば、プロジェクトPancake向けに、MobileComponentを作ったとしましょう。
その後に立ち上がったプロジェクトFruitcakeでもモバイル対応が必要だとします。
そこで簡単に思いつくのは、MobileComponentのファイルを丸ごとコピーすることです。
しかし、この方法には問題があることにすぐに気づきます。
MobileComponentでバグがあった場合はどうするか?
プロジェクトPancakeのMobileComponentを修正すれば良いでしょう。
しかし、プロジェクトFruitcakeはどうするか?
コピーし直す?
そんなの面倒です。
しかも、独自の修正がプロジェクトFruitcakeに加えられているかもしれない。
単純にコピーしただけではプロジェクトFruitcakeが動かなくなるかも…。
コンポーネントにバグがあると、突然こんな恐怖に苛まれます。
今日は、これらの手間を省いたり、ソースコードを保証するためにバージョン管理システムGitを使います。
CakePHPのコアコードをGitで管理する
手始めにCakePHPのコアコードをGitで管理しましょう。
CakePHPはGithubで管理されています。
つまり、Gitを使ってソースコードをダウンロードできます。
やり方は簡単です。
Gitがインストールされたサーバで以下のコマンドを実行するだけです。
git clone https://github.com/cakephp/cakephp.git
私はCakePHPのコアコードを共通で使いたいので、/usr/lib以下のcakephp1.3というディレクトリを作って配置します。
つまり、こんなコマンドを打ちます。
cd /usr/lib sudo git clone https://github.com/cakephp/cakephp.git cakephp1.3
次にやるのは、CakePHPを自分の使いたいバージョンに合わせることです。
CakePHPリポジトリでは、バージョンをブランチとタグで管理しています。
現状では、こんなブランチとタグが存在します。
- ブランチ
- 1.2
- 1.3
- 1.3-postgresql
- 2.0
- 2.0-config
- 2.0-controller
- 2.0-pdo
- 2.0-spl
- 2.0-upgrade
- gh-pages
- master
- タグ
- 1.3-dev
- 1.3.6
- 1.3.5
- 1.3.4
- 1.3.3
- 1.3.2
- 1.3.1
- 1.3.0-beta
- 1.3.0-alpha
- 1.3.0-RC4
- 1.3.0-RC3
- 1.3.0-RC2
- 1.3.0-RC1
- 1.3.0
- 1.2.9
- 1.2.8
- 1.2.7
- 1.2.6
- 1.2.5
- 1.2.4
- 1.2.3
- 1.2.2
- 1.2.1
- 1.2.0
ブランチでは、各バージョンの最新のソースコードを管理しています。
タグでは、公式に公開した各マイナーバージョンのソースコードを管理しています。
タグとブランチは、開発する上でその運用が異なります。
しかし、Gitにとってはこれらに違いはありません。
(詳しく知りたい方はオライリーの実用Gitがオススメです。)
git cloneで出来たディレクトリに移動し、以下のコマンドを実行することで、自分の好きなソースコードを手に入れることが出来ます。
ブランチの場合は、以下のコマンドを実行します。
sudo git checkout -t origin/[ブランチ名]
タグの場合は、以下のコマンドを実行します。
sudo git checkout -b [タグ名]
私は先ほどgit cloneで作成したディレクトリで、CakePHP1.3.xの最新版を管理しています。
sudo git checkout -b 1.3.6
このようにディレクトリをGitで管理しておけば、バージョンアップも簡単です。
最新版がリリースされたら、次のコマンドを実行します。
cd /usr/lib/cakephp1.3 sudo git fetch sudo git tag sudo git checkout -b [最新のバージョンナンバー]
これで楽にCakePHPのコアコードのバージョン管理が出来ますね!
ちなみに、この方法で管理しておけば、”コアコードリーディングの途中に、うっかりコードを編集してしまった!“ということも防げますよ。
(git statusを実行すると、どのコードが編集されたかわかります。git checkout — [ファイル名]で編集前の状態に戻せます。)
外部ライブラリをGitで管理する
うまくCakePHPをGitで管理出来ましたか?
次は外部ライブラリをGitで管理してみます。
“自身のプロジェクトのソースコードがGitで管理されていること“を前提とします。
さて、何のライブラリを入れましょうか。
定番のdebug_kitを入れましょう。
自分のプロジェクトのディレクトリに移動した後に、以下のコマンドを打ちます。
git submodule add https://github.com/cakephp/debug_kit.git plugins/debug_kit git add plugins/debug_kit .gitmodules git commit -m 'Add debug_kit plugin.'
これで、plugins/debug_kitにdebug_kitプラグインのソースコードがダウンロードされます。
.gitmodulesという不思議なファイルが出来たので中身を確認してみます。
[submodule &quot;plugins/debug_kit&quot;] path = plugins/debug_kit url = https://github.com/cakephp/debug_kit.git
意味は簡単に分かるでしょう。
- plugins/debug_kitをサブモジュールとして管理しますよ。
- そのモジュールはhttps://github.com/cakephp/debug_kit.gitで管理しますよ。
ということです。
次はこのプロジェクトをgit cloneします。
(プロジェクトのリポジトリは/home/tfmagician/advent_calendarにあるとします。)
git clone file:///home/tfmagician/advent_calendar ~/advent_calendar_clone cd ~/advent_calendar_clone ls plugins/debug_kit
git cloneは出来たのですが、plugins/debug_kitの中身は空です。
そこで以下のコマンドを打ちます。
cd ~/advent_calendar_clone git submodule init git submodule update ls plugins/debug_kit
これでplugins/debug_kitにソースコードがダウンロードされました。
この状態では、debug_kitは名無しのブランチとなっています。
そこで、debug_kitを自分の使いたいブランチに切り替えます。
cd ~/advent_calendar_clone/plugins/debug_kit git checkout -b 1.3.0 git branch
これで外部ライブラリのバージョンを、自身のプロジェクトと別に管理できます。
git submodule addしたライブラリは、単純なGitのリポジトリです。
バージョンアップがあった場合は、git fetchやgit pullで最新の状態に更新できます。
しかし、少し注意点が。
git submoduleは便利なのですが、git cloneをするときに少し手間です。
先ほど示した通り、サブモジュールのブランチは手動で切り替える必要があります。
実際に使う場合は、git submodule initやupdate、ブランチの切り替えなどをひとまとめにしたセットアップスクリプトを用意しておくと良いかもしれませんね。
より詳しくgit submoduleについて知りたい場合は、以下のページが参考になります。
CakePHPでは、ソースコードを以下のように管理するよう規約で決まっています。
(不要な部分は省いています。)
models/ # アプリケーションで使用するモデル + behaviors/ # モデルの処理を共通化するビヘイビア views/ # アプリケーションで使用するビュー + helpers/ # ビューの処理を共通化するヘルパー controllers/ # アプリケーションで使用するコントローラ + components/ # コントローラの処理を共通化するコンポーネント plugins/ # CakePHPのプラグイン vendors/ # 外部ライブラリ
このうち、git submoduleで管理するのはpluginsディレクトリとvendorsディレクトリでしょう。
behaviorsやcomponents、helpersもgit submoduleで管理したくなるのですが、そのあたりの住み分けは次で説明します。
自分のコードをGitで管理する
最後は、自分のコードをGitで管理しましょう。
自分のコードといっても、単純にGitを使うだけではありません。
git submoduleを使った複数プロジェクトでのコード管理です。
git submoduleの使い方は、先ほど説明したので省略します。
CakePHPにおいて、どのようにgit submoduleを活用するかに焦点をおきます。
models/ # アプリケーションで使用するモデル + behaviors/ # モデルの処理を共通化するビヘイビア views/ # アプリケーションで使用するビュー + helpers/ # ビューの処理を共通化するヘルパー controllers/ # アプリケーションで使用するコントローラ + components/ # コントローラの処理を共通化するコンポーネント plugins/ # CakePHPのプラグイン vendors/ # 外部ライブラリ
CakePHPではこのような構成を取ります。
プロジェクトを立ち上げた後、共通処理がbehaviorsとcomponents、そしてhelpersにまとまります。
コードを書いていると、ふと気づきます。
このコードは他のプロジェクトで再利用出来るんじゃないか?
そのことに気づいた時点で、そのコードは別に管理したくなるはずです。
幸いにもCakePHPにはプラグインという仕組みがあります。
CakePHPのプラグインでは、pluginsディレクトリの中に通常のCakePHPアプリケーションと同じ構成のアプリケーションを配置できます。
配置したアプリケーションは、親のアプリケーションから自由にインポート出来ます。
つまり、再利用したいと考えたコードはプラグインとしてまとめて、git submoduleで管理すれば良いんです。
例として、ビヘイビアに焦点を当てて考えてみましょう。
以下の構成で、RicepanBakerBehavior(ricepan_baker.php)を複数プロジェクトで共通化したいとします。
models/
+ behaviors/
ricepan_baker.php
something.php
tests/
+ cases/
+ models/
+ behaviors/
ricepan_baker.test.php
something.test.php
+ fixtures/
bakery_fixture.php
something_fixture.php
plugins/
これをこのように変更します。
models/
+ behaviors/
something.php
tests/
+ cases/
+ models/
+ behaviors/
something.test.php
+ fixtures/
something_fixture.php
plugins/
+ ricepan/
+ models/
+ behaviors/
ricepan_baker.php
+ tests/
+ cases/
+ models/
+ behaviors/
ricepan_baker.test.php
+ fixtures/
bakery_fixture.php
これで、ソースコードやテストケースを完全に分離できました。
あとはplugins/ricepanをGitリポジトリとして分離し、どこかにホストすればOKです。
その後は、先ほど紹介したgit submoduleを使って管理ですね。
ホストする場所はどこでも良いのですが、せっかくなのでGithubなどの公開リポジトリに置けないかを考えてみましょう。
ソースコードを公開すれば、それだけ共通の資産が増えますからね。
他の人のアドバイスも貰えるかもしれない。
自分の成長の手助けにもなるでしょう。
いかがでしょうか。
初心者向け…で書いたつもりが、GitやCakePHPの前提知識がかなり必要な内容となってしまいました。
しかし、Gitは使いこなすと本当に便利です。
フレームワークとも相性はバッチリです。
どんどん活用していきましょう!
明日は@ecworks_masapさんです。
CakePHP辞典の著者としてものすごいtipsを書いてくれるでしょう!
期待してます!
|
CakePHP辞典
|
CakePHPプラグインのまとめ – ヘルパー編
- 2010年9月4日 4:00 AM
- CakePHP

CakePHPプラグインのまとめもこれで最後になります。
最後はヘルパーとその他のソースの紹介です。
便利なヘルパーたち
- Graham Weldon’s Gravatar: ヘルパーを使って簡単に君のアプリケーションにGravatarを埋め込んでくれるよ。ベーカリーの記事はここ。
- Chris Your’s CakeHelper: “今まで君のCakePHPのビューでHTMLブロックをキャプチャーするクリーンな方法を、そしてそれを後から$content_for_layoutのように使いたいと思ったことは?” このヘルパーはRailsのcontent_forをCakePHPに実装してくれるよ。とても良いね。
- Joe Beeson’s Analogue Helper: ときどき君はコアヘルパーのふりをするヘルパーが欲しくならない?なぜ?それがどれぐらい地獄か知ってる?けど君はこれを使えばそれが出来るんだ!
- Graham Weldon’s Auto-Javascript: 阿呆なGrahamはまだコードを分割して置くことを拒否してるよ :P 知る人は知っていると思うけど、彼はJavaScriptのテンプレートへの組み込みを効率化するために小さなヘルパーを書いたんだ。ベーカリーの記事はここ。
180行のコードで出来たGravatar対応のためのヘルパーです。
Gravatarって何っていう人は公式サイトをどうぞ。
ビューでCakeHelper::capture()とCakeHelper::content_for()を使うことで$content_for_layoutを独自に定義出来ます。
つまり、$content_for_sidebarや$content_for_leftなどを自分で用意出来るということ。
ビューがわかりやすくなるので結構使えるのでは?
これは便利かもしれません。
よくヘルパーに機能が足りず、コアヘルパーを継承してMyHtmlやMyPaginationなど作ると思うのですが、このMyHogeHogeをコアヘルパーの代替えとして使えるようになります。
つまり、$this->MyHtml->url()という形ではなく、$this->Html->url()といった形で呼び出せますね。
コントローラ名やアクション名と対応したJSを自動で探し、includeしてくれるヘルパーですね。
特定のコントローラにだけJSを当てたいときに便利ですね。
便利だとは思うのですが、これを便利便利と使いすぎるとダウンロードするJSの数が増え、ページ表示が遅くなると思うので注意が必要かと。
その他の素晴らしいソース
- Carl Sutton’s Google Plugin: 誰かこいつに賞をやってくれ。たくさんのGoogle APIをCakePHP向けに統合したんだ。なんでも来い、だ。
- ライブラリ
- google_api_adsense.php
- google_api_adwords.php
- google_api_analytics.php
- google_api_blogger.php
- google_api_calendar.php
- google_api_checkout.php
- google_api_contacts.php
- google_api_finance.php
- モデル
- google_contacts.php
- google_adwords.php
- google_analytics.php
- google_blogger.php
- google_calendar.php
- google_checkout.php
- google_contacts.php
- google_finance.php
- データソース
- google_contacts_source.php
- google_adwords_source.php
- google_analytics_source.php
- google_blogger_source.php
- google_calendar_source.php
- google_checkout_source.php
- google_contacts_source.php
- google_finance_source.php
- ヘルパー
- chart
- map
- Joe Beeson’s Sassy: これが気に入ったなら、君はSASSが大好きだな。JoeはCakePHPにSASSを実装出来る(君のためにリリースされた)この狂ったプラグインを定義し、ビルドしたんだ。
これは確かにこれは賞に値すると思います。
説明するよりも、このファイル一覧を見た方が早いですね。
すごいですよね。
これは一度使ってみたいプラグインです。
SASSって何?と思ったのですが、どうやらCSSを定義するためのメタ言語のようですね。
CSSより簡潔にメンテナンスしやすいコードを書けるようです。このヘルパーはSASSをリクエスト毎にCSSに変換してくれる機能を提供するようです。
ここで気になるのはcontent_forのヘルパーとコアヘルパーの代替えを簡単に行えるヘルパーでしょうか。
Googleのプラグインもすごいですね。
一度、どうなっているのかレビューしてみたいところ。
CakePHPプラグインのまとめはこれで最後です。
長々とお付き合いして頂き、ありがとうございました。
翻訳がかなり適当なので、間違いがあればご指摘ください(私の勉強にもなるので!)。
あ、総括編でこれらのページをまとめようと思うので、もう1記事だけお付き合いください(笑)
[2010/09/07 追記]
hiromi2424さんからAnalogueプラグインよりも便利ですよ。とHackプラグインを紹介頂きました。
- HackPlugin
ヘルパーやコンポーネント、モデルのエイリアスを設定出来るようです。
これを知っていれば、今作ってる機能にも使えたな…。次のリファクタリングのときにでも使いましょうか。
[連載記事一覧]
- 認証編
- AuthComponentの代替えになるプラグインやfacebookと連携するプラグインが紹介されています。それに加え、使いにくいACLを使いやすくするツールも。個人的には一番、興味のある記事でした。
- 検索とページネーション/ファイルアップロード編
- CakePHPの使いにくいページネーションを使いやすくするプラグイン、Yahoo! BOSSのプラグインが紹介されています。ファイルアップロードはTransloaditというサービスに対応させるプラグインから、メジャーなメディアプラグインまで。
- 最適化/デバッグ編
- CakePHP 2に取り込まれるであろうプラグイン、そしてContainableBehaviorをさらに高機能にしたようなプラグインが紹介されています。DebugKitの使い勝手を向上するものもありますよ!
ホーム > タグ > プラグイン
- エキスパートPythonプログラミング読書会 第二期 07の募集を開始しました! http://t.co/DuVQ32jM #expertpython 2 days ago
- 受付を撤収したので、遅れてくる方は @sanojimaru か、 @tfmagician まで声をかけてください。 #expertpython 3 days ago
- http://t.co/e4N59JH3 4章ですね、募集ページを修正しました。 #expertpython 3 days ago
- More updates...
- 無印良品の高度なFacebook連携がさすがだと思った件 « Looops 直人の備忘録
- Node.jsがどうして注目されているのか、もしくはどうして他のサーバサイドJavaScriptはスルーされているのか - id:anatooのブログ
- 0から始めるiPhoneからのWordPress更新術。第9回 終わりに。一連の流れ ...
- shell.vim 0.9.6 -- Improved integration between Vim and its environment (fullscreen, open URL, etc)
- Cakephp auth refresh websites and posts on cakephp auth refresh
- さよなら、iPhone。 日本でも訴訟されて発売されるGalaxyS2の凄さがわかる動画 alpha device
- フィードからの情報をデスクトップ通知してくれるChrome拡張機能「RSS Alert」
- PHPとアジャイル開発の勉強会を開催しました | 48JIGEN
- レノボ、Android 採用の ThinkPad タブレットを今夏発売へ。Windowsタブレットは年内
- 致命的すぎるバグがgithubで話題 « A-Listers





