ホーム > タグ > デプロイ

デプロイ

CakePHP開発者が知るべき10のこと

10 things you must know about cakephp

先日、こんな記事が上がっていました。

この記事でまとまっているのは、Android開発において必要な10の項目です。
インターフェースの設計から、データの取り扱いまで。

AndroidはモバイルデバイスのOSで、CakePHPは単なるWebフレームワーク。
しかし、予め用意されたルールやAPIを活用する点は同じです。
つまり、フレームワーク全般において、開発者が知るべきことをまとめることが出来るはずです。

ここでは、私が良く利用するCakePHPフレームワークについて、開発者が知るべき10のことをまとめます。


フォーラムにこの記事を書き込んだところ、shunさんがtipsを追記してくれています!
モデルに、配列を取り入れた経緯などを紹介してくれています。
こちらも併せてどうぞ。

1. CakePHPで良いのか

Cakephp logo

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 EngineAmazon AWS、あるいはその他のPaaS
環境を用意するのは、昔ほど難しくありません。
そして、コストもさほど高くありません。

私は、”PHP/CakePHPを使うな“と言っているのではありません。
盲目的にならず、その開発がどんなものかを考えて、フレームワーク選ぶべきだと言っているのです。

これは、CakePHPに限ったことではありませんが

2. CakePHPの癖を知る

Cakephps model

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>]

はじめての Django アプリ作成、その1より

>> 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. 高速開発手法を知る

Cakephps develop

せっかく、フレームワークを使うのだから、その資産を利用しましょう。
フレームワークの資産、それはプラグインです。

例えば、あなたがtwitter連携機能を開発しているとします。
必要なのは、あなたの書いたコードでなく、これらのプラグインです。

Facebook連携機能をエンハンスするとします。

さらに、携帯サイトに対応するとします。

これらのプラグインを作り、公開してくれる人はだいたい決まっています。
その人たちを把握しておきましょう。

順不同、敬称略です。
複数のCakePHPプラグインを公開している方をまとめました。
全てgithubへのリンクとなっているので、フォローしておくと良いでしょう。

4. 学習方法を知る

Cakephps study

CakePHPを学ぶ方法を知ることは、あなたのためにも、そしてあなたの周りに居る人のためにもなります。

あなたの作ったウェブサイトを、後輩に引き継ぐかもしれない
あるいは、新たなCakePHP開発者を追加するかもしれない

こうした場合に、CakePHPの良い学習方法を知っていると役に立ちます。

対象者が、フレームワーク、それどころかPHPの初心者である場合、CakePHPの公式マニュアルが役に立ちます。

これは簡単なブログ作成のチュートリアルで、初心者でも手軽に始めることが出来ます。

しかし、このチュートリアルには弱点があります。
それは、MVCモデルを活用しきれていないこと
もし、このチュートリアルだけでCakePHPを学習すると、ひどい目に遭います。

次に、学習すべきはこれです。

モデル側にロジックをまとめることを覚えましょう。
あるいは、hiromi2424さんのエントリも大変参考になります。

CakePHPを利用したウェブサイト開発を一通り学習したいのであれば、この本がお勧めです。

CakePHPによる実践Webアプリケーション開発 CakePHPによる実践Webアプリケーション開発

  • 著者: 安藤 祐介, 岸田 健一郎, 新原 雅司
  • 出版社: 毎日コミュニケーションズ
  • 発売日: 2009/04/08

CakePHP v1.2を対象に書かれているため、少し情報が古い可能性があります。
しかし、その点を除いても、大変参考になります。
業務アプリケーションを対象とした開発手順は、とても実践的です

最後に、話題のTDDをCakePHPでも取り入れましょう

Webアプリケーションテスト手法 Webアプリケーションテスト手法

  • 著者: 水野 貴明, 石井 勇一, 新藤 愛大, 岸田 健一郎, 荻野 淳也, 安井 力, 田中 慎司
  • 出版社: 毎日コミュニケーションズ
  • 発売日: 2008/07/25

CakePHP 1.3で標準テスティングフレームワークSimpleTestの使い方が、わかりやすくまとまっています。

5. サイトを高速化する

Cakephps speedup

サイトのアクセス負荷が増えてきたときのために、その負荷対策もCakePHP開発者は知るべきでしょう
まず、簡単なところから。

CakePHP 2.0でも標準で取り入れられたプラグインです。
モデルの読み込みをマジックメソッドに寄せることで、プログラムのロードを高速化します。

一般的なウェブサイトであれば、全てのページが動的である必要はありません
まずは、デフォルトのキャッシュシステムを利用しましょう。

しかし、このキャッシュシステムは完璧ではありません。
プログラムのロードが少なくなるだけで、少なからずCakePHPが呼ばれます。

そこで、静的ページには次のプラグインを利用します

このプラグインを利用すると、HTMLの静的ファイルをwebroot以下に吐き出してくれます
CakePHPにアクセスしないのだから、爆速ですよね。

モデル側のキャッシュは、デフォルトで用意されているキャッシュ機構を利用します。

これを有効化すると、クエリ毎に結果をキャッシュしてくれます
ただし、1リクエスト毎のメモリキャッシュである点と、データ更新後の挙動には注意が必要です。

最後に、独自のキャッシュ機構を用意する場合
Cacheクラスを利用します。

自動でシリアライズをしてくれたり、キャッシュの有効期限を決めれたりと、便利なクラスです。

6. デプロイを自動化する

Cakephps deploy

CakePHPはデプロイが簡単です。
作成したアプリケーションを、ウェブサーバが参照出来る場所に置くだけです。

しかし、長期で運用する場合、色々と問題が生じます。
例えば、一時ファイルの問題です。

CakePHPはデフォルトでも、アプリケーションに支障が出ない範囲で様々なファイルをキャッシュし、一時ファイルに格納します。
そのため、新たなコードやファイルを追加した場合に、この一時ファイルが悪さをすることがあります
予期せぬエラーが発生する場合、この一時ファイルが悪さをしていることが多いのです。

デプロイの度、一時ファイルを手動で消しても良いのですが、それは面倒です。
そして、ミスも増えます。

デプロイの簡単なCakePHPですが、その処理も自動化しておくと、多くのメリットが得られます

CakePHPもCapistranoを利用し、デプロイを自動化できます。
もし、CLIに慣れないエンジニア、あるいはデザイナーが周りに居る場合は、Webistranoも良いでしょう

Capistranoを使えば、簡単にデプロイを自動化できます。
しかし、データベースのマイグレーションが課題として残ります
CakePHPのスキーマシェルは、とても貧弱です
デフォルトのアップデート機能では、自動デプロイに耐えることが出来ません。
そこで、CakeDCが公開しているMigrationsPluginを利用します。

このプラグインを利用することで、Ruby On Railsのようなマイグレーションシェルを得ることが出来ます。
マイグレーションアップ、マイグレーションダウンも自由自在です。

7. 継続的インテグレーションを取り入れる

Cakephps ci

4. 学習方法を知る“の中で、テストの話に簡単に触れました。
もし、あなたがテストケースを運用し始めたなら、継続的インテグレーションを取り入れましょう。

CakePHPでも、Hudsonを利用することで継続的インテグレーションすることが出来ます
Ryuzeeさんの記事を見れば、数時間で環境を整えられるでしょう。

8. バリデーションを活用する

Cakephps validate

CakePHPを利用するのに欠かせない機能。
それはバリデーションです。

マニュアルの例は、とてもシンプルです。
バリデーションには、この他にも様々な使い道があります

4. 学習方法を知る“でも紹介しましたが、hiromi2424さんの記事を参考にしてください。

さらに、バリデーションを使うにあたって以下のことを踏まえておきましょう。

  • バリデーションは必ずしも、テーブルのフィールドと1対1でなくても良い。つまり、テーブルに存在しないフィールドに対しても、バリデーションを定義出来る。
  • 独自バリデーションメソッドの中から、保存予定の全てのデータにアクセス出来る。つまり、Model::$dataプロパティを利用し、複雑なバリデーションも書ける。
  • Model::beforeValidate()コールバックを利用することで、オプションによってバリデーションを切り替えることが出来る

バリデーションメソッドは、様々な可能性を秘めています。

9. エディタを活用する

Cakephps editor

CakePHPを利用出来るエディタを把握しましょう。
PHPを書くことが出来るエディタであれば、開発に支障はありません。
しかし、専用のプラグインがあるエディタを利用すれば、開発速度が上がります。

個人的に残念なのは、有用なvimプラグインがないことです。
そのうち、個人的に開発したいと思っているので、vimmerの方はしばしお待ちを。

10. 最新の情報を得る

Cakephps info

最後に、CakePHPのトレンドを把握するために、必要な情報源を押さえましょう。

全てRSSリーダーに登録しておけば、ばっちりですね。
もし、CakePHPネタをたくさん書いてるのに、載っていない!っていう人が居たら教えてください。
掲載させて頂きます。

かなりの長文になってしまいました。
(そして、最後はヘタってしまいました:(

恐らく、生粋のCakePHP Bakerの皆さんは全て押さえているでしょう。
初級、あるいは中級者の方の参考になれば、幸いです。

また、他のフレームワークでも、”知るべき10のこと“シリーズを書いてみませんか?

ホーム > タグ > デプロイ

スポンサードリンク
書いている人
つぶやき
  • setup.pyのinstall_requiresにgitのリポジトリを指定したい。どうすればいいかな。 1 day ago
  • ツイッタークライアントを久々に開いたけど、なんか違和感。 3 days ago
  • 最近、イベント参加出来てないな(_ _) 3 days ago
  • More updates...
RSS 気になるニュース
過去の記事

ページの上部に戻る