CakePHP5でヘルパーから他のヘルパーを読み込む方法・CakePHP4からの変更点
2025/01/31
CakePHP5でヘルパーから他のヘルパーを読み込む方法・CakePHP4からの変更点
CakePHP5でオリジナルのヘルパーを作成し、そのヘルパー内で HTMLヘルパーや Formヘルパーなどを使用する場合もあるかと思います。
https://book.cakephp.org/5/ja/views/helpers.html#id10
ですが、上記の日本語の Cookbookは間違っておりまして、そのままでは動作しません。
また、CakePHP4のソースをそのままコピペしても動作しませんので、併せてご注意ください。(上記の Cookbookのソースは CakePHP4の時のものとなっています。)
次項が正しいソースとなりますのでご注意ください。
CakePHP5でヘルパーから他のヘルパーを読み込む際の正しいソースコード
/src/View/Helper/LinkHelper.php
上記に「LinkHelper.php」というオリジナルのヘルパーファイルを作成したとします。
この時の正しいソースコードは下記となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php namespace App\View\Helper; use Cake\View\Helper; class LinkHelper extends Helper { protected array $helpers = ['Html']; public function makeEdit($title, $url) { // 出力に HTML ヘルパーを使用 // 整形されたデータ: $link = $this->Html->link($title, $url, ['class' => 'edit']); return '<div class="editOuter">' . $link . '</div>'; } } |
CakePHP5の日本語 Cookbookの間違い箇所、および、CakePHP4からの変更点
https://book.cakephp.org/5/ja/views/helpers.html#id10
下記のソースコードは上記の CakePHP5の日本語 Cookbookに記載があるソースコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php namespace App\View\Helper; use Cake\View\Helper; class LinkHelper extends Helper { public $helpers = ['Html']; public function makeEdit($title, $url) { // 出力に HTML ヘルパーを使用 // 整形されたデータ: $link = $this->Html->link($title, $url, ['class' => 'edit']); return '<div class="editOuter">' . $link . '</div>'; } } |
先に紹介した正しいソースコードと何が違うかというと、8行目の「$helpers
」の前に型を定義する「array」があるかどうか、です。
「array」を付けると正しく動作します。
1 2 3 4 5 |
//【正しい記述】 protected array $helpers = ['Html']; //【間違いの記述】 public $helpers = ['Html']; |
「protected」か「public」かの違いもありますが、これはどちらでも動作します。
(「protected」と「public」の違いが分からない方は別途調べてみてください。)
Fatal error: Type of App\View\Helper\LinkHelper::$helpers must be array
のエラーメッセージが表示される
間違っている方の記述で実行すると、下記のようなエラーメッセージが表示されます。
「Fatal error: Type of App\View\Helper\LinkHelper::$helpers must be array (as in class Cake\View\Helper) in C:\xampp\htdocs\src\View\Helper\LinkHelper.php on line 6
」
「$helpers
は配列型である必要があるよ」というエラーなので、型を指定すればよさそうだということに気づく可能性はゼロではありませんが、公式の Cookbook通りに記述しても動作しないので、延々と悩んでしまいました。
ちなみに、最初の正しいソースコードは、下記の英語版の Cookbookに記載があるソースコードです。
https://book.cakephp.org/5/en/views/helpers.html#including-other-helpers
というワケで、日本語の Cookbookで動作しない場合は、英語版の Cookbookを参照してみるのもいいかもしれません。
CakePHP5の日本語 Cookbookの間違いの原因は CakePHP4のソースコードのままである点
なぜ、日本語の公式 Cookbookのソースコードが間違っているか、というと CakePHP4のヘルパーのソースコードがそのままコピペされていて、CakePHP5版に変更されていないためです。
CakePHP4 Cookbook ヘルパー
https://book.cakephp.org/4/ja/views/helpers.html#id10
というワケで、オリジナルのヘルパーから他のヘルパーを読み込む処理で、CakePHP4と CakePHP5との違いは、ここで紹介した「$helpers
」の型指定の「array」の有無ということになります。
CakePHP4のソースコードを利用して CakePHP5の開発を行う際は、この点を注意する必要があるということになりますね。
CakePHP5の関連記事
CakePHP4系、5系でカラムを指定して値があるかないかのチェックするCakePHP4、5のnewEmptyEntityで作成したオブジェクトは空なのか、確認してみた
CakePHP4、5でSELECT telephone as tel FROM usersの様にasでカラムに別名を付ける方法
CakePHP4、5の認証処理で認証が通らない際の確認方法と確認箇所の紹介
CakePHP5系で認証機能のAuthenticationプラグインをインストール・エラー発生注意
CakePHP5でヘルパーから他のヘルパーを読み込む方法・CakePHP4からの変更点
CakePHP5系でDeprecatedを回避しfindListでキーと値のカラムを指定して取得する方法
その他の「CakePHP5」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でajaxを利用する処理の実装方法を解説。プルダウンを変更するとデータベースの値を取得し検索結果の内容を変更するというような処理を想定。CakePHP3.6以降の CSRF対策対応済。
-
-
CakePHP3のビューで受取ったテーブルのオブジェクトを連想配列に変換する方法
コントローラーからビューに送ったテーブルのオブジェクトを連想配列に変換し、ビューの中で自由に使えるようにするメソッド「toArray()」の解説。連想配列に変換できれば利用度アップ!
-
-
CakePHP4のフラッシュメッセージの表示場所、デザインを変更する方法を解説
CakePHP4のエラーメッセージ、完了メッセージなどを表示するフラッシュ処理の解説。Controller、レイアウトファイル、テンプレートファイルでそれぞれ処理を指定する。
-
-
CakePHPのFlashエラーは出るが入力項目ごとのメッセージが出ないエラーの原因
Bakeして自動生成した入力フォーム処理を元に少し処理を追加したら、入力エラーがあってもエラーメッセージが表示されなくなった。原因はリダイレクトの処理にあった。
-
-
CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応
CakePHP3で検索を担うプラグイン「friendsofcake/search」の紹介。基本的な設置方法の紹介のほか、処理の記述方法のバリエーション、エラーの解説など。CakeDC/searchより導入は簡単!
-
-
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3でデフォルトのソート条件を設定しつつ画面上でユーザがソート条件を選択したときもソート処理を実行させる方法を解説。ソート条件はページネーションの処理として実装。
-
-
CakePHPで Auto Incrementを外すと Duplicate entry ‘0’ for keyのエラーが出るかも
CakePHPでAuto Incrementの設定を変更したときに「Duplicate entry ‘0’ for key」のエラーが出た。原因はModel内で IDを編集する処理の追加を忘れていたからだった。
-
-
CakePHP3、CakePHP4のキャッシュをクリアする方法「bin/cake cache clear_all」を使う
CakePHP3、CakePHP4では処理を高速化する手法の一つとしてキャッシュを利用している。しかし、その情報は元の情報を更新しても反映されない場合がある。そんなときはキャッシュを削除する必要がある。
-
-
CakePHP4の定数定義ファイルを環境変数によって本番と開発を振り分ける方法解説
CakePHP4で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定しそれを読み込み判別する。
-
-
CakePHP 2.3 Search Pluginで検索処理 その1設置方法
CakePHPの検索プラグイン Search Pluginの設置方法と基本的な検索処理の解説です。