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の関連記事
CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法
CakePHP4、CakePHP5系の認証処理でログインの有無の確認、ユーザ情報の取得の方法
CakePHP4、5で$_SERVERと同じようにURIを取得する「getUri()」の紹介
getParam('action')で取得するアクション名は別関数に移動しても不変CakePHP4系、CakePHP5系のexists()でカラムを指定して値の有無をチェックする方法解説
CakePHP4、5のnewEmptyEntityで作成したオブジェクトは空なのか、確認してみた
CakePHP4、5でSELECT telephone as tel FROM usersの様にasでカラムに別名を付ける方法
CakePHP4、5の認証処理で認証が通らない際の確認方法と確認箇所の紹介
CakePHP5系で認証機能のAuthenticationプラグインをインストール・エラー発生注意
その他の「CakePHP5」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3、CakePHP4、CakePHP5のバージョンを指定してインストールする詳細な手順を解説
CakePHP3のバージョンを指定してインストールする方法を詳細解説。CakePHP3のインストールはComposerを使うため設定もほぼ自動で完了。データベースの接続情報を記載すればアプリ開発のベースが整う。
-
-
CakePHP3でassociatedを使って関連データをまとめて保存する方法(hasOne、hasMany、belongsTo)
CakePHP3で関連データをまとめて保存する方法。hasOne、hasMany、belongsTo等の関連データはassociatedを追加することでまとめて保存することができます。
-
-
CakePHP3のデバッグキット(DebugKit)を強制的に有効、無効に変更する方法
CakePHP3に付属しているデバッグのためのツール、デバッグキットを強制的に有効化、無効化する方法を解説。初期設定では開発環境としてありそうなドメインの場合のみ有効になるように設定されている。
-
-
VirtualBoxにCakePHP3を設置。必要なCentOS、Apache、PHP、MySQL、Composerをインストールし設定する
VirtualBoxにCentOS、Apache、MySQL、PHPをインストールするところから初めてCakePHP3の開発環境を構築する手順を詳細解説。この記事1つで全ての設定が完了する。
-
-
CakePHP 2.3で PDFを作成する方法を調査「mpdf」「TCPDF」「FPDF」
CakePHPで PDFを編集、出力するには「mpdf」「TCPDF」「FPDF」といったプラグインがあり、使い勝手を比較検討しました。TCPDFが一番良さそうでした。
-
-
CakePHP3でDocumentRootやwebroot、imgフォルダのURLやドメイン、パスを取得
URLやドメイン、フォルダへのパスの取得は、ビューではUrlHelperを使い、コントローラーではRouterクラスを使います。第2引数の指定でURLを取得することも可能。
-
-
CakePHP4で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。
-
-
CakePHP4、CakePHP5系の認証処理でログインの有無の確認、ユーザ情報の取得の方法
CakePHP4系、5系のログイン認証の可否のチェック、および、ログインユーザの情報を取得する方法のまとめ。複数の方法があるが手続きが微妙に異なるためまとめてみた。
-
-
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。
-
-
MySQL、CakePHP 2.3で「tinyint(1)」の Boolean型の動作を再確認
MySQL+CakePHPの環境で「tinyint(1)」を利用する際の動作を検証。「tinyint(1)」の Boolean型について CakePHPでは自動処理が実施されていることを確認しました。