質問: 実現したいことは、ページを表示する前に一括で文字列を変換することです。 smartyのアウトプットフィルターのような機能があれば良いのですが、CakePHP3で同じようなことをするにはどのようにしたら良いでしょうか。 --- 質問内容についていくつかご指摘をいただきましたので、詳しく説明します。 CakePHPで最終的に出力されるhtmlに対して次のような処理を一括で実行したいと考えています。 ・html中の半角カタカナをmb_convert_kanaで全角カタカナに変更 ・html中のある文字列を他の文字列に置換 このような処理を記述して実行する機能はCakePHPにあるのでしょうか。これらの処理の対象となる文字列はコントローラで設定したもの、ビューに記述しているものなど出力されたhtml全てです。 CakePHPの出力時のフィルターについて検索して調べてみたのですが、そのような情報が見当たりませんでした。そういう機能自体がないのかもしれませんが、もしご存知の方がいらっしゃれば教えてください。 よろしくお願いします。
回答: `コントローラで設定したもの、ビューに記述しているものなど出力されたhtml全て` を一括で変換することは、予期しない変換が発生するため **おすすめできません** が以下のようにして可能です。 1. テンプレートで変換する Viewのキャプチャー機能を利用してコンテンツを記録し、書き換えます。 読んでね: ビューブロックの使用 | ビュー - 3.8 Template/Layout/default.ctp ``` start('convertContent'); // キャプチャー開始 ?> end(); // キャプチャー終了 $content = $this->fetch('convertContent'); // キャプチャー内容を取得 // 変換処理 $content = mb_convert_kana($content, 'KV'); // ... その他の変換処理 echo $content; // 変換した内容を出力 ?> ``` 2. View.afterLayout イベントで変換する イベントフックを利用し、描画内容を書き換えます。 読んでね: ビューイベント | ビュー - 3.8 と イベントシステム - 3.8 ``` EventManager::instance()->on('View.afterLayout', function (Event $event) { $view = $event->getSubject(); $content = $view->Blocks->get('content'); // 変換処理 $content = mb_convert_kana($content, 'KV'); // ... その他の変換処理 $view->Blocks->set('content', $content); }); ``` 改めて書きますが、レンダリング結果全体への変換処理は予期しない変換が発生し描画内容が壊れる可能性があるためおすすめできません。 可能なかぎりデータソースからの取得時に変換しておくか、Controllerでの値セット前に出力用のオブジェクトを通して変換したり、テンプレートで明示的に個々の要素に対して変換するようにすべきです。