CakePHPで高速Webアプリ開発

第13回ヘルパーの作り方

ヘルパーとは

CakePHPにはビューの処理を効率化するための「ヘルパー」と呼ばれる機構があります。また、単にビューの一部を部品化して再利用するだけであれば「エレメント」を使用する方法あります。エレメントは本連載の第8回で使用しています。

ヘルパーを使う機会

ヘルパーを作る機会は、絶対数的には少ないです。というのも、ビューの効率化はエレメントで事足りることが多いからです。第8回では使用していませんが、renderElementメソッドには引数を渡すこともできるので、関数呼び出しのように引数を付けてエレメントを使用することが可能です。エレメントはベタのphpファイルなので、とてもシンプルでデザイナーフレンドリーなことも強みです。

それでもヘルパーの作り方を学ぶことは良いことです。その理由は、ビュー内での複雑な計算や、コードの重複がいくつも発生するときなどにヘルパーが適しているからです。ヘルパーの本体はPHPのクラスであり、メソッドなどを自由に作れるので、効率的に記述できます。エレメントの場合、classやfunctionを作ることは想定されていないため、順次実行的にしか記述できません。

また、有志が公開している便利なヘルパーを使用する際、ヘルパーの作り方を知っていれば、マニュアル以上の理解を得ることができます。

本記事ではCakePHP1.1系でのヘルパーの作り方を解説します。

ヘルパーファイルの仕様

設置場所

ヘルパーは通常、1ヘルパー1ファイルで記述します。ファイルはapp/views/helpers/ディレクトリ内に設置します。helpersディレクトリがなければ、自分で作成してかまいません。app/views/helpers/ディレクトリ内にはヘルパーファイルのみが格納されます。

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

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

たとえば「GihyoCommon」ヘルパーは、以下のようになります。

  • GihyoCommonHelperクラス
  • app/views/helpers/gihyo_common.php

クラス定義

GihyoCommonヘルパーのクラス定義は以下のようになります。CakePHPコアで定義されたHelperクラスを継承します。

<?php
class GihyoCommonHelper extends Helper {
}

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

ヘルパーを作ってみよう

では、GihyoCommonヘルパーとして、gihyo.jp のURLを返す機能を実装してみます。

app/views/helpers/gihyo_common.php
<?php
class GihyoCommonHelper extends Helper {
  var $_index_url = 'http://gihyo.jp/';
  function getIndexUrl() {
    return $this->output($this->_index_url)
  }
}

「$this->output(~)」は、/app/config/core.php で定義された AUTO_OUTPUT定数の設定よって、出力するか、文字列で返すかが決まるメソッドです。出力するか返り値にするかは動作としてはまったく別物です。返り値にしておくと、値を使って何かをしたいときに対応し易いです。出力にしておくと、echo文などが不要になるので記述が少なく済みます。どちらが良いかは、状況やお好み次第でしょう。ここでは AUTO_OUTPUT定数はfalseで、返り値になる前提で解説します。

このGihyoCommonヘルパーを使用する場合のコントローラの例が以下になります。

app/controllers/example_controller.php
<?php
class ExampleController extends AppController {
  var $uses = array();
  var $helpers = array('GihyoCommon');
  function index() {
  }
}

ヘルパーの使用において直接的に関係するのは以下の1行です。

  var $helpers = array('GihyoCommon');

この行で、GihyoCommonヘルパーを使用することを定義しています。

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

次に、GihyoCommonヘルパーのgetIndexUrlメソッドを使用するビューの例です。

app/views/example/index.thtml
<?php echo $gihyoCommon->getIndexUrl(); ?>

ビュー内では、ヘルパークラスのインスタンスが、ヘルパー名の頭文字が小文字の変数名で定義されています。コントローラやモデルとは異なった規則なので注意が必要です。

ヘルパー内から別のヘルパーを使用したいときは

ヘルパーからは別のヘルパーをそのまま使用することができません。最初から定義されているhtmlヘルパーも使用できません。

ヘルパー内から別のヘルパーを使用するには、準備が必要です。以下のように、ヘルパークラス内で$helpersプロパティに使用したい他のヘルパーを定義してください。

app/views/helpers/gihyo_common.php
<?php
class GihyoCommonHelper extends Helper {
  var $helpers = array('Html');
  var $_index_url = 'http://gihyo.jp/';
  function getIndexLink($title) {
    return $this->output($this->Html->link($title, $this->_index_url));
  }
}

定義したヘルパーは、ヘルパー名と同じ変数名で $thisの中にインスタンスが定義されます。定義されたインスタンスはビューの中で定義されているものと同じですので、ビューと同じように使用できます。

ヘルパーの基本的な知識は以上です。うまく使えばビューのコード量や複雑さを軽減することができますので、ぜひチャレンジしてみてください。

おすすめ記事

記事・ニュース一覧