ヘルパーとは何か整理する(基本編)【CakePHP3.8】

今までなんとなくテキストやサンプル通りに書いて組み込んできたHelperだけど、プラグインやら、お膳立てされた機能を使っていくにつれてところどころ気になり始めたから重い腰を上げて整理しておく。

備忘録ノート。(基本編)

環境
cakephp: 3.8
PHP: 7.4

ヘルパーとは?

ヘルパーとは、、

ヘルパーはアプリケーションのプレゼンテーション層のためのコンポーネントのようなクラスです。 多くのビューやエレメント、レイアウトで共有される表示ロジックを含んでいます。 この章では、ヘルパーを設定する方法を紹介します。ヘルパーの読み込み方法、 それらのヘルパーの使い方、独自のヘルパーを作成するための簡単な手順を概説します。

https://book.cakephp.org/3/ja/views/helpers.html

遠回し的な言い方だけど、つまり、ビューの開発効率を上げるために用意されたメソッドをまとめたクラス群。言い換えると、アプリケーションの作成に必要なもろもろの実装のためのAPIのようなものといったところ。

初心者のうちによくみかけるのがこんなHelperたち。

  • Htmlヘルパー
  • Formヘルパー
  • Breadcrumbs(パンクズ)ヘルパー
  • Paginaorヘルパー

これらはどれもMVCのV,ビューにおいて使っていくのでHelper=ビューのための機能と思っていたけど、実際こんなHelperたちもいる。(敬称略)

  • Rss
  • Session
  • Time

とはいえ、一応HelperとはViewのための機能らしい。

他にもいくつかHelperは登場してくるので、一覧は公式リファレンスで。

さらに、誰かが自作したHelperもプラグインとして読み込んで利用することもできるので(もちろん自分作も)、Helperの活躍の場はさらに広がってくる。というかcakeの開発は必然的にHelperと仲良くやっていかないといけないくらいなので公式ページで挨拶くらいしとくといい。

既存のHelperをオーバーライドして使い方を変えたりといったこともできる。

ヘルパーの使い方

ヘルパーそれぞれで使い方は変わってくるので、最も基本的なFormヘルパーを使ってみる。

Formヘルパーを使う

FormHelperはその名の通り、フォーム要素を作成する時に役立つHelper。

htmlタグをそのまま描くよりも多少書きやすいし量も少ない(かも)、意味的にわかりやすいなど、メリット盛りだくさんなのでぜひ使ってほしい。

<?= $this->Form->create($user) ?>
    <fieldset>
        <legend><?= __('Add User') ?></legend>
        <?php
            echo $this->Form->control('nameid');
            echo $this->Form->control('password');
            echo $this->Form->control('name');
            echo $this->Form->control('mail');
        ?>
    </fieldset>
    <?= $this->Form->button(__('Submit')) ?>
    <?= $this->Form->end() ?>

これを実行したhtmlコード

<form method="post" accept-charset="utf-8" role="form" action="/bootTestApp-3/users/add">
            <div style="display:none;"><input type="hidden" name="_method" value="POST" /><input type="hidden" name="_csrfToken" autocomplete="off"
                  value="8ea4329a0bc211b6906a5f46797454570bde82eebd6099d8b1170a437cb5a563089e715ca5b392127fc4a2441a5909e810d95ab24dd840edc0effcd961fed80d" /></div>
            <fieldset>
                <legend>Add User</legend>
                <div class="form-group text required"><label for="nameid">Nameid</label><input type="text" name="nameid" required="required" maxlength="50" id="nameid" class="form-control" /></div>
                <div class="form-group password required"><label for="password">Password</label><input type="password" name="password" required="required" id="password" class="form-control" /></div>
                <div class="form-group text"><label for="name">Name</label><input type="text" name="name" maxlength="50" id="name" class="form-control" value="no name" /></div>
                <div class="form-group text"><label for="mail">Mail</label><input type="text" name="mail" maxlength="100" id="mail" class="form-control" /></div>
            </fieldset>
            <button type="submit" class="btn btn-secondary">Submit</button>
        </form>

面倒なlabelタグもclass属性も自動的に記載してくれている。

しかも、CSRF対策のためのワンタイムトークンもおまけでつけてくれている。

レンダリングのためのdivタグまで用意してくれているからこれを手で全部書いていくよりも断然楽だし速い。

何よりも、動的に生成されるってところがめちゃめちゃ嬉しくて、ModelやControlllerやConfigを変えた時に必要だったりする変更やら、フォーム要素を追加しなくちゃならないときにそれぞれのタグ付の修正をせずに済む。

まあ今の時代のエンジニアにとって当たり前のことかもしれないけど、テキストをみながら「PHP×HTML」で勉強してきた身からするとこうゆう機能ってテンションあがる(笑)。

Htmlヘルパーを使う

HtmlHelperについても1分くらいで読めるようにまとめておく。

<?=$this->Html->charset() ?>
<meta charset="utf-8">

<?=$this->Html->css('bootstrap.min') ?>
<link rel="stylesheet" href="bootstrap.min.css" />

<?=$this->Html->script('bootstrap.min') ?>
<script src="bootstrap.min.js" charset="utf-8"></script>

その他に使えるHtmlHelpterはこちら

ヘルパーの設定

Helperを知っておく時に最低限知っておくと困らない設定について今回はまとめておく。(知らなくても困らないかもしれんけど、知らないままだと困る)

memo

気になったので探してみたらHelpterの定義ファイルはここにあった。
./vendor/cakephp/cakephp/src/View/Helper/*Helper.php

ヘルパーをロード

cakephpでHelperを使うときはView内で宣言する。

// View/AppView.php
class AppView extends View
{
    public function initialize()
    {
        parent::initialize();
        // ここにHelperを追加していく
        $this->loadHelper('Html');
        $this->loadHelper('Form');
        $this->loadHelper('Flash');
    }
}

けれど、cakephpやアプリケーションにあるHelperを明示的に読み込む必要はない。(Htmlなどは書く必要がない)ロード時に遅延読み込みされる。

// View/AppView.php
class AppView extends View
{
    public function initialize()
    {
        parent::initialize();
        // ここにHelperを追加していく
        // Html,Form,Flashなどは結局何も書かずとも使える
    }
}

どんな時に使うのかというと、デフォルトの表示形式から少し手を加えて独自のタグを出力するときなどに、その設定を適用するために使ったりする。

プラグインのヘルパーをロード

プラグインのHelperを読み込むときはプラグイン記法を使う。

// Blogプラグインの場合
$this->loadHelper('Blog.Comment');

条件付きヘルパーの読み込み

アクション名がindexの時のみ読み込みたい場合はif文を使って書けばおけ。

class AppView extends View
{
    public function initialize()
    {
        parent::initialize();
        if ($this->request->getParam('action') === 'index') {
            $this->loadHelper('ListPage');
        }
    }
}

他にも条件の組み立て次第でHelperの読み込みを制御できそう。

Controllerでロード

コントローラーでもbeforeRenderメソッドを使用して読み込むことができる。

class ArticlesController extends AppController
{
    public function beforeRender(Event $event)
    {
        parent::beforeRender($event);
        $this->viewBuilder()->helpers(['MyHelper']);
    }
}