スポンサーリンク

CakePHP4のAppと自作プラグインについて

これまでに作成したCakePHP4のAppと自作プラグインについてメモ。

Appについて

CakePHP3の頃の公式のAppがベースです。
非公開のリポジトリとしてCakePHP3の頃から開発し続けています。
後述するすべてのプラグインはapp/plugins以下にサブモジュールとして置くことで開発しています。
アップデートの情報が上がる出るたびに自分のプロジェクトも追従する形でcomposer updateおよびソースのリファクタリングを行っています。
以下が標準のCakePHPのAppから手が加わっている点になります。

  • Authenticationプラグインを使用した管理者ログイン機能付き
    • adminsというテーブル、CakePHPで扱うためのエンティティ、テーブルクラスが存在します
    • アカウントは追加が可能、追加したアカウントの権限管理が可能
    • 二段階認証の設定が可能
  • javascriptについてwebpackのトランスパイルを行うよう仕組化
    • javascriptのライブラリはnpmで管理しています
    • webpackでトランスパイルするリソース(js、css、scss)はAppのAssetsディレクトリ以下にまとめています
    • App直下にpackage.json、package-lock.json、webpack.config.jsを追加しています
  • その他
    • bootstrap.phpで.envを有効化しています
    • ファイルアップロード機能を実装するトレイトが存在します
    • 管理者のログインパスワードについて暗号化/復号化を行うクラスが存在します
    • configディレクトリにグローバルな呼び出しを行う関数をまとめたファイル、定数を管理するファイル、各機能のプロパティを管理するファイルが存在します
      • Configure::read() が _code()で呼び出せるようになっています
    • App直下に独自のphpcsルールセットが存在します。
      • 変数名のスネークケースを許容しています
      • エラー制御演算子「@」の仕様を許容しています

公開中のプラグインについて

OperationLogs

GitHub:https://github.com/imo-tikuwa/cakephp-operation-logs

リクエストのターゲットとなるコントローラに入る前の時間(リクエスト日時と呼んでる)と、コントローラに入って処理を行ったあとの時間(レスポンス日時と呼んでる)を計測し、1回のリクエストのメイン部分に対して掛かった時間を記録するミドルウェアを提供するプラグインです。時間の他にクライアントIPとユーザーエージェントも記録します。
特定のURLを含むリクエストを記録対象から除外したり、特定のユーザーエージェントからのリクエストのみを記録対象するといった設定が可能です。
蓄積したデータを月毎、日毎、時間ごとに集計するコマンドも提供しています。

ZipcodeJp

GitHub:https://github.com/imo-tikuwa/cakephp-zipcode-jp

郵便番号を元に住所(都道府県、市区町村、町域)を検索する機能を提供するプラグインです。
日本郵政のサイトから郵便番号と住所のzipデータを取得し、データベースにzipcode_jpsというテーブルを作成&データを投入、郵便番号を元にzipcode_jpsを検索しjsonで返すAPIを提供します。

郵便番号を元に住所を取得するという処理はajaxzip3,YubinBangoなど著名なライブラリが既に存在しますが、こちらは自身のシステム内にデータを展開するため、一度データを展開しておけば外部のネットワークとの接続が遮断された状態でも問題なく動作させることが可能となっているのが特徴と言えます。

SoftDelete

GitHub:https://github.com/imo-tikuwa/cakephp3-soft-delete

テーブルクラスに論理削除機能を提供するプラグインです。
こちらのCakePHP3用の論理削除プラグインをフォークし、一部をCakePHP4用に書き換えています。
なので正確には自作ではありません。。

論理削除を使用したいテーブルクラスにSoftDeleteTraitをuse宣言で追加します。
デフォルトではdeletedというdatetime型のカラムを使用します。
ORMによる削除を行うことでdeletedカラムに削除日時が入ります。
ORMを使用してデータを取得する際、where句にdeleted IS NULLの検索条件が自動追加され論理削除されたデータを取得しないようになっています。

Utilities

これまでに作成したプラグインをつなぐためのユーティリティプラグインになります。
非公開のプラグイン内にのみ存在したが、本番運用にも必要となってくるような処理をコマンドクラスとして提供しています。
以下のコマンドが存在します。

  • execute_all_migrations_and_seeds
    • すべてのマイグレーションとシードを実行するコマンド
  • recreate_admin
    • 管理者を再生成するコマンド
  • trim_comment
    • 指定したパス以下のファイルのphpdoc以外のコメントを削除するコマンド。
      Tokenizerを使用した字句解析を行い、字句のトークンIDがT_COMMENT定数のものを削除しています。
      過去にCakePHPを使ったプロジェクトで必要になって個別のプラグイン化までは必要ない感じだったのでここに追加したんだったと思います。
      メインのコメントを削除する処理はこちらにGistとしても提供しています。

非公開のプラグインについて

AdminBaker

CakePHP4+PHP8+MySQL5.7を使ったCMSを作るためのプラグインです。
上の方で長々と書いたAppをベースとして、そこにユーザーが定義した設定を元にCRUDのプログラムを追加していきます。
これまでに作ってきたプラグインの中で一番開発に時間をかけています。

元々CakePHPには標準でbakeという自動生成の仕組みが存在しますが、このプラグインは詳細な項目設定を元に細かい機能の作成が可能となっています。

このプラグインについてはこちらのページで詳細について書いています。

ApiGenerator

CakePHP4のエンティティクラス、テーブルクラスを元に雑にRESTAPIを生成するプラグインです。
マネージャー画面で親となるテーブル名を指定、取得するデータに含めたいカラムを指定
親テーブルクラスと紐づく子テーブルクラスについても同様の設定が可能です。
作成ボタンを押すことで、ルーティング、APIコントローラのbakeが行われます。

①入力画面で生成したいAPIの情報を入力
②確認画面で生成されるリソースの確認
③完了画面
④生成したAPIに直アクセスして動作確認
ErdGenerator

CakePHP4のテーブルクラスを元にER図(っぽい資料)をリバース生成するプラグインです。

  • 使用するにはGraphvizのインストールが必要です
  • 図の部分はテーブルクラスのアソシーエションを元に生成しています
    ⇒外部キー制約が付いて無くてもGraphvizで生成する画像のリレーションを構築可能
①ER図トップ
②各テーブルの情報

その他

公開中のリポジトリについて思い付きで修正を加えたりするかもしれません。
リリースの際のセマンティックバージョニングについてあまり考えず気分でやってしまっています。。(なんか大きい修正した気がしたらマイナーバージョン上げちゃったりしてる)
もしご使用になられる場合はcomposer.jsonでバージョンをロックされると良いかもしれません。

タイトルとURLをコピーしました