アンケートご協力のお願いgihyo.jpでは,2010年度に向けて豪華プレゼントが当たる読者属性アンケートを実施しております。ご協力ください。

gihyo.jp » DEVELOPER STAGE » 連載 » CakePHPで高速Webアプリ開発 » 第12回 コンポーネントの作り方

CakePHPで高速Webアプリ開発

第12回 コンポーネントの作り方

コンポーネントとは

CakePHPには「コンポーネント」と呼ばれる機構があります。CakePHPにおけるコンポーネントとは何かという定義は難しいのですが,CakePHP プログラマーズ リファレンスガイドの定義が短く的確なので引用させていただきます。

コンポーネントというのは,(コントローラ間で)共有できる小さな“コントローラレット”だ。

9章 コンポーネントより

たとえば1つのコントローラ内のコードで重複する箇所が発生するとき,コントローラ内のメソッドとして定義して再利用することがあります。この再利用の範囲である「コントローラ内」を「別々のコントローラ間」まで広げてくれるのが,コンポーネントです。

コンポーネントを使うべきか否かはプログラマの裁量次第です。あるコードをコンポーネントに移すことで全体の開発効率が良くなると感じれば,やってみてください。

本記事ではCakePHP1.1系でのコンポーネントの作り方を解説します。

コンポーネントファイルの仕様

設置場所

コンポーネントは通常,1コンポーネント1ファイルで記述します。ファイルは app/controllers/components/ディレクトリ内に設置します。componentsディレクトリがなければ,自分で作成してかまいません。app/controllers/components/ ディレクトリ内にはコンポーネントファイルのみが格納されます。

クラス名・ファイル名の命名規則

コンポーネントは1つのクラスとして定義します。クラス名は「コンポーネント名のCamelCase(単語の頭文字が大文字)+Component」です。ファイル名はコンポーネント名を小文字で,単語をアンダースコアで区切り,拡張子をphpとします。

たとえば「GihyoCommon」コンポーネントは,以下のようになります。

  • GihyoCommonComponentクラス
  • app/controllers/components/gihyo_common.php

クラス定義

GihyoCommonコンポーネントのクラス定義は以下のようになります。CakePHPコアで定義されたObjectクラスを継承します。

<?php
class GihyoCommonComponent extends Object {
}

このクラスに自由にプロパティやメソッドを作成してコントローラから呼び出すことができます。

コンポーネントを作ってみよう

では,GihyoCommonコンポーネントとして,gihyo.jp のRSSを取得する機能を実装してみます。

app/controllers/components/gihyo_common.php

<?php
class GihyoCommonComponent extends Object {
  var $_index_rss_url = 'http://rss.rssad.jp/rss/gihyo/feed/rss2';
  function getIndexRSS() {
    return file_get_contents($this->_index_rss_url);
  }
}

注:このサンプルはphpのsafe_modeが有効だとエラーになります

このコンポーネントをコントローラから使用する例が以下になります。

<?php
class ExampleController extends AppController {
  var $uses = array();
  var $autoRender = false;
  var $components = array('GihyoCommon');
  function index() {
    echo $this->GihyoCommon->getIndexRss();
  }
}

コンポーネントの使用において直接的に関係する箇所は以下の2ヵ所です。

  var $components = array('GihyoCommon');

GihyoCommonの使用を定義しています。

使用したいコンポーネントがあるとき,コントローラの$componentsプロパティにコンポーネント名の文字列を配列で定義します。

    echo $this->GihyoCommon->getIndexRss();

GihyoCommonコンポーネントのgetIndexRssメソッドを呼び出しています。

コンポーネントはコントローラのインスタンス内に,コンポーネント名と同じ名前のプロパティとして定義されるので,$thisから参照してメソッドなどを呼び出すことができます。

コンポーネントからモデルを使用したいときは

コンポーネントからはコントローラで定義したモデルなどはそのままでは使用することができません。コンポーネント内での $this は,コンポーネントのインスタンスへの参照です。コントローラ内に定義されるモデルのプロパティは存在しません。

コンポーネント内でモデルを使用するには,モデルのインスタンスを新たに作成するか,コンポーネントの初期化時にコントローラの参照を受け取ってコントローラ経由で使用する方法の2通りがあります。

最も簡単な方法は,モデルのインスタンスを新たに作成する方法です。

<?php
class GihyoCommonComponent extends Object {
  function getUsers() {
    $user =& new User();
    return $user->findAll();
  }
}

この例では,$user はUserモデルのインスタンスです。

ちなみに,コントローラ側でUserモデルを利用できる状態でないときにコンポーネント内で new User()を行うと,「Fatal error: Class 'User' not found」というFatal Errorが発生してしまいます。使用したいモデルのファイルが読み込まれておらず,クラスが定義されていないためです。

ということで,モデルはそもそもコントローラ側で定義されていることが前提となります。そこで,モデルの状態のことを考慮する必要はありますが,コントローラを経由して参照する方法を紹介いたします。

事前準備として,コンポーネントの初期化時に呼び出されるstartupメソッドによってコントローラのインスタンスへの参照を受け取って保持します。そして保持したコントローラを経由してモデルを参照する簡単な例が,以下になります。

<?php
class GihyoCommonComponent extends Object {
  var $_controller;
  function startup(& $controller) {
    $this->_controller = $controller;
  }
  function getUsers() {
    return $this->_controller->User->findAll();
  }
}

モデル以外にもコントローラのプロパティに値をセットしたりもできるので,他にも活用方法があります。ただしコンポーネントからコントローラの状態を変更したりするのは,アプリケーションの見通しに悪影響を及ぼす可能性が高いです。個人的には,よっぽどの効率向上が期待される場合以外は,コントローラの状態変更は控えておいたほうが良いと思います。

なお,これらのコンポーネント例は解説用にシンプルさが優先されているため,コンポーネント化するほどではありません。この程度であれば,getUsersメソッドの機能はUserモデルに定義すべきです。コンポーネントからモデルを使用するのは,もっと複雑な要件があるときにしたほうが良いでしょう。

コンポーネントをうまく使えると,ある程度規模の大きいアプリケーションの見通しがかなり良くなりますので,ぜひ,使用してみてください。

著者プロフィール

秋田真宏(あきたまさひろ)

株式会社ヨセミテ CTO。個人ブログは「akiyan.com」。1981年生まれ。

URLhttp://www.akiyan.com/

著書

  • Fast CakePHP

    Fast CakePHP

コメント

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

読むウェブ ~本とインタラクション

ディスプレイで読む活字とそのインタラクション(interaction:相互作用)について,最新Webを紹介しながら読み解いていく。

いま,見ておきたいウェブサイト

この連載では,国内外の最新のウェブサイトを隔週更新で取り上げ,これら最新サイトの特徴や素晴らしい部分を,さまざまな角度から解説していきます。

Windows phoneアプリケーション開発入門

Windows Marcketplace for Mobileがサービス開始され,作成したアプリケーションを個人でも世界をターゲットに公開できる環境が整ってきました。これを機にWindows phoneアプリケーションの開発をしてみませんか?

ここは知っておくべき!Windows Server 2008技術TIPS

5年ぶりのサーバOSとなったWindows Server 2008が出荷されて早2年。2009年にはR2が出荷され,再び注目を集めています。発売前から実施したトレーニングによって感じた,インフラエンジニアの方々に知っておいていただきたい機能を中心にご紹介します。

キーパーソンが見るWeb業界

本連載はWeb Site Expert/gihyo.jpとの連動企画です。阿部淳也, 長谷川敦士, 森田雄のお三方による,Web業界をテーマにした座談会です。

きたみりゅうじの聞かせて珍プレー

ソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。みなさんからの投稿もお待ちしてます!

ActionScript 3.0で始めるオブジェクト指向スクリプティング

野中文雄氏が,簡単なスクリプトは書いたことがあるという初級者を対象に,ActionScript 3.0の基本からクラス定義までを解説します。

まだ間に合う「ITパスポート」受験対策 原山先生の短期合格塾

この連載では,4月18日のITパスポート試験の受験に向けて,短い期間で効率良く受験対策を行う方法や,確実に得点するための裏ワザなどを伝授していきます。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス