見出し画像

PHP8.1対応作業。テンプレートエンジンに苦しめられる。

POTI-boardで採用していたHTML template for PHP の老朽化

POTI-boardは15年前からテンプレートエンジンを使っていました。
PHP本体とHTMLパートの分離を実現し、HTMLの変更もPHP本体の変更もスムーズにできる構造でした。

しかしテンプレートエンジン HTML template for PHP が老朽化。
PHP5で動作しない→パッチをあてる→PHP7でエラーがでる→パッチをあてるという作業を行ってやっと動作していました。

PHP8では動作しないという内容のエラー。

テンプレートエンジンSkinny.phpで非推奨のエラー

そこで、2020年5月にPOTI-boardのテンプレートエンジンの入れ替えを行いました。
しかし、PHP8.1でテンプレートエンジンSkinny.phpから非推奨のエラー。
現時点でのエラーのレベルは警告にすぎませんが、PHP9では動作しなくなる可能性がでてきました。

Skinnyの構文をPHPに変換する時に発生する非推奨のエラー。

Skinny.phpに自分でパッチをあてればエラーはでなくなりますが、それではHTMLテンプレートにパッチをあててごまかしながら使っていたのと同じです。
しかし、テンプレートエンジンを変更すると再度のHTMLパートの全書き直し作業が必要になります。
書き直す必要があるテンプレートは、日本語2種類、英語、繁體中文合計4種類。作業量は1年半前の前回の時の4倍です。

テンプレートエンジンが変更になるという事はテンプレートエンジン固有の文法が変更になるという事ですから、SkinnyからBladeに書き直す場合は…。

<% def(hoge)%><% echo(hoge)%><% /def %>

Skinnyのこの構文は…。

@if($hoge) {{$hoge}} @endif

Bladeではこうなります。

これが数行ならどうという事はないのですが、POTI-boardのHTMLパートは複雑かつ膨大…。
頑張って更新してきたPOTI-boardですが、さすがに放り出す事も考えました。

テンプレートエンジンの変更から1年半しかたってないのにまたエンジン変更で膨大な量のファイルを変更してそれを動作確認してさらに翻訳作業も…。

↑エラーの確認からBladeOneへのエンジンの載せ替えまでをTweetしたスレッド

テンプレートエンジンを使わないテンプレート式のPetit Note

POTI-boardがなくなっても別にいいのでは?と思ったのは、Petit Note というお絵かき掲示板PHPスクリプトをすでに作っていたからでした。

PetitNoteはテンプレートエンジンを使用しないテンプレート式のお絵かき掲示板です。
プログラム本体と出力用のHTMLファイルを完全に分離しています。
しかしテンプレートエンジンは使っていないので、テンプレートエンジンに振り回される心配がありません。
キャッシュを使って高速化しなくても最初からPHPなので高速です。
「テンプレートエンジンを使いなさい」「でないとPHPとHTMLがごちゃまぜになってしまう」という意見をよく耳にします。
実際に何度かそう言われました。

しかし、違いは…。

<% def(hoge)%><% echo(hoge)%><% /def %>
@if($hoge) {{$hoge}} @endif
<?php if($hoge):?><?=h($hoge)?><?php endif;?>

上から順にSkinny、Blade、素のPHP。

テンプレートエンジンを使用する場合はデバッグする時にキャッシュフィルの該当エラー行を探して問題を確認し、テンプレートエンジンの該当ファイルにもどって修正する必要がありますが、最初からPHPで書いていればエラーがでたファイルを開いて修正するだけです。
ケースバイケースだとは思いますが、素のPHPのテンプレートのほうが作業時間が短くなる場合も。
「でも関数内でHTML部分を書くの?」と思った方もいらっしゃるかもしれません。
関数の最後の出力処理のところでHTMLパートをincludeすればPHP本体とHTMLパートを分離したまるでテンプレートエンジンを使っているかのような素のPHPのテンプレートを使う事ができます。

POTI-boardの開発も継続しますが、せっかく作ったPetit Noteです。
使ってみていただけないでしょうか?

POTI-board EVO v3.22.8 でv3系統の開発を終了しv5へ

POTI-board EVO v3.22.8をv3系統の最終バージョンにしました。
Skinny.phpにパッチをあてました。このパッチのみでもPHP9で動作する可能性があります。
しかし、問題を先送りするわけにもいきませんので、今後はテンプレートエンジンをBladeOneに変更したバージョン5の開発をすすめます。

二度にわたるテンプレートの非互換となりました。
テンプレートの作者の方が作ってくれたテンプレートは使えなくなりました。
同梱のテンプレートも作り直したものです。

既存のテンプレートを使いたい方は、v3.22.8を使うしかありませんが、将来的なサポートはありません。

これまで使う事ができたテンプレートを切り捨てる。
アドオンを切り捨てたFirefoxがより一層シェアを落としたのと同じような事になるのかもしれません。
しかし、数年先の事を考えると必要な判断だったと思っています。

素のPHPのテンプレートは?
POTI-boardは出力用の連想配列に出力のための変数をすべて格納しているので、その配列のまま素のPHPのテンプレートに渡すとより一層コードが冗長になります。
extract()関数を使えばテンプレートエンジンを使った時と同じような変数名で処理できるのですが…。

前回の記事で紹介した方法では extract() を使用していましたが、この関数は連想配列を単独変数に展開するため、実行速度・メモリの消費・既存変数との衝突、といった点で不利な傾向がありました

https://qiita.com/yasumodev/items/5e1b2ca5dbc4921a52f3

extract()は使わないほうがよさそうだったので。
テンプレートエンジンを使うと連想配列のキーが変数名に変換されますから、extract()または同等の処理をしているような気もしますが…。

お絵かき掲示板交流サイト

お絵かき掲示板交流サイト内のPOTI-boardのテンプレートエンジンもBladeOneに変更しました。
BladeOneは使っている人が多いテンプレートエンジンで、更新頻度も高いようです。
しかし、BladeOneの最新版はPHP5.6では動作しませんでした。
PHP7.2以上の環境が必要になりました。

Petit Noteはテンプレートエンジンを使っていないので依存関係があまりありません。
またPetit Noteは日記モードで使っているユーザーが多いお絵かき掲示板です。

お絵かき掲示板の新規設置を検討されている方はPetit Noteの利用もぜひご検討ください。

開発している本人の目線としては…。
歴史と伝統あるPOTI-board。
古いログファイルを持っている方もいるはずなので、それが動く環境が必要→POTI-boardバージョン5。

新しいお絵かき掲示板を設置したい→Petit Note。

なかなか思い描いているようにはいかないのかもしれませんが…。

POTI-boardのログファイルをPetitNoteで使う

POTI-boardからPetitNoteへログを変換して移行する事もできます。
POTI-boardだけでなく、古いBBSNoteのログファイルも変換できます。

Petit Noteをよろしくお願いします。
POTI-boardの開発も続けます。

いいなと思ったら応援しよう!

この記事が参加している募集