【覚えておくと便利】CakePHP3.8で使える書き方サンプル

【覚えておくと便利】CakePHP3.8で使える書き方サンプル

今回は、プログラミングに関する短めの記事になります。

自分は普段CakePHPを使った開発をすることが多いので、ある程度汎用的に使える部品を作っておいて、Webサイト・システムに合わせて部品を組み合わせて使っていたりします。

本記事では、自分がCakePHPでよく使う書き方のサンプルやちょっとした部品について紹介できればと思います。(書いていたら長くなってきたので分割して紹介します)

CakePHPは社内で使う要件の込み入ったプロジェクト管理システムから月間1,000万PVに耐えられるようなCMSなど、かなりの柔軟に対応できるフレームワークですので、CakePHPを使ってWebシステム開発をされる方の参考になれば幸いです。

続きとして「【覚えておくと便利】CakePHP3.8で使える書き方サンプル2」も書きましたのでよかったらご参考ください。

目次


i18n対応の進め方

まず、使い回しを作っていく上で、i18n対応は欠かせませんので最初にi18n対応を済ませておくのがおすすめです。

i18n対応しておくことでメッセージの文言変更を簡単にしたり、いざ英語対応が必要になっても翻訳ファイルを用意するだけで対応できるようになりますので、諸々の手間が削減できます。

日本語の翻訳対応をするのは以下のような手順になります。

  1. cake/src/Locale/ja_JP ディレクトリを作成する
  2. 1にdefault.po という名前で以下のようなファイルを作る
  3. cake/config/.envAPP_DEFAULT_LOCALE="ja_JP"に変更または追加する
  4. PHP内で__('test')と呼び出すと自動で「テスト」に翻訳される(Template内では<?= h(__('test')) ?>のような書き方になります)
msgid "test"
msgstr "テスト"

エラーメッセージを日本語で直接PHP内に書いていて、文言変更になったときにまとめて置換していくというのがよくあるかと思いますが、i18n対応しておけば修正箇所が1箇所で済むのでとても便利ですね。


Controllerのaction毎のタイトル設定

こちらは、Controllerの中に1つ関数を足すと自動でHTMLのtitleタグに反映されるようにするための仕組みです。(自分で使ってて意外と便利だなと思っているので共有です。)

かなり細かいテクニックになりますが、一度作ってしまえばかなり汎用性が高くなりますので、よかったらご参考ください。

必要な要素は以下です。

  • AppControllerもしくは各コントローラで継承する基底Controller(BaseController.php)
  • 共通ヘッダーもしくはタイトルのために読み込むelement用ctp(title.ctp)
  • 各コントローラ(SampleController.php)で関数title[Action]を実装する

それぞれサンプルコードを記載して解説していきます。

abstract class BaseController extends AppController
{
public function beforeFilter(Event $event)
{
parent::beforeFilter($event);

$titleAction = 'title' . \ucfirst($this->request->getParam('action'));
$this->set('page_title', method_exists($this, $titleAction) ? $this->$titleAction() : '');
}
}
(title.ctp)
<title>
<?= h($page_title) ?>
</title>
class SampleController extends BaseController
{
public function titleList() : string
{
return __('sample-list');
}
}

まず、基底ControllerのbeforeFilter(各コントローラで毎回呼ばれます)で、今呼ばれているアクション名からタイトル取得用の関数を探す処理を呼び出して、$titleActionに入れます。

タイトル取得用の関数は、例えばアクション名がlist()の場合はtitleList()のようになります。これを各コントローラ(SampleController.php)側で実装します。

$titleAction = 'title' . \ucfirst($this->request->getParam('action'));

取ってきたタイトルをTemplate側で$page_titleで呼び出せるようにセットします。

$this->set('page_title', method_exists($this, $titleAction) ? $this->$titleAction() : '');

実際のTemplate側では以下で出力します。

<?= h($page_title) ?>

各コントローラ側では以下でタイトルを返す処理を実装していきます。

public function titleList() : string
{
return __('sample-list');
}

ここで、i18n対応をしておくと翻訳用ファイル(po)と.envの変更だけでタイトルも自動で切り替えられるようになります。

この仕組みを使うことで、各action関数に対応するタイトル用関数を実装するだけで、自動的にTemplate内でタイトルのセットまでできるようになり、かなり使い回しが利くようになります。


Collectionから配列を取り出す

基本的なところですが、EntityクラスのCollectionから特定の要素を取り出して配列にする方法です。

主にTemplate側でselectboxを作るときやradioボタンの選択要素として、テーブルから取得したものを配列を渡すときによく使いますね。

サンプルとしては、以下のようなEntityクラスがあったときに、

/**
* @property int $id
* @property int $type
* @property string $name
* @property string $ext
* @property FrozenTime $created
* @property FrozenTime $updated
*/
class Sample extends Entity {}

$idと$typeの連想配列を作るときは、

$t = TableRegistry::getTableLocator()
->get('samples')
->find()
->all()
->combine('id', 'type')
->toArray();

typeが20のものだけを対象として、$idと$nameの連想配列を作るときは、

$t = TableRegistry::getTableLocator()
->get('samples')
->find()
->where(['type' => 20])
->all()
->combine('id', 'name')
->toArray();

のように指定すれば、Collectionから配列に変換できます。


以上、自分がCakePHPでよく使う書き方のサンプルやちょっとした部品についての紹介でした。

次回は以下を紹介しようと思っています。

  • TableでValidationを書くときの簡素化
  • form要素を作る時の簡素化

CakePHPを使ったWebシステム開発をされている方の参考になれば幸いです。

<< 返金保証付きプログラミングスクールで >> 未経験から最短でエンジニア転職を目指す TECH::EXPERT

この記事もおすすめ