やったことだけ書く備忘録

PHP製のOSSメールフォーム作ったよ

PHPのリハビリに


東京に引っ越してからさっぱりPHPを書かなくなったので(業務で一度書いたくらいですが)、ここらで改めて処理系を復習をしたいと思ってまして。

今現在で、比較的新しめのPHPバージョンで上手く動作するOSSのPHPメールフォームがあんまりないみたいな話も聞いていたので、せっかくだし使って貰えそうなものを作りたい、というのもありました。

PHPの入門アプリといえばメールフォームかブログエンジンですよね!

とりあえず、できたのはコレです。



Terrier: PHP mailform Application



めちゃシンプルな割にクラスがとっちらかってる感あります…。



開発に際して


リハビリってこともあって、レギュレーションを決めました。勝手に。



他のライブラリに依存しないこと。


このご時世に何言ってんだと言われると思いますが、リクエスト処理からハンドリング、テンプレーティング、メール送信まで一から書きました。メールフォームくらいでWAF使うのも仰々しいし、あんまりポータブルでないのも導入しにくいだろうし、ってことで。



PHP5.3+で動作すること。


以前にCMSを作っていたことがあったのですが、その頃はPHP5.1系のサポートなんかもやってて色々つらいこともありました。そこから触れなくなってしまったので、今回は新しめの機能を使ってみたいなということでPHP5.3以上で動くように作りました。便利になったもんだ。



利用者がなるべくPHPを書かなくてもいいような設計にすること。


PHP自体がテンプレートエンジンだって言えばそれまでですが、基本HTMLにテンプレート用のタグを入れれば動くようにしました。あとは規約より設定、ってことでなるべく設定で挙動制御できるように(設定自体はPHP書かないといけないんですが><)あとは少しばかりユーザ拡張もできるようにしたかった。



OSSとしてリリースすること。


こういうのはソース公開してナンボなので。



がんばったところ


結構時間かかってしまって、その分頑張ったところなど。



テンプレートエンジン


Smarty/PHPTAL/Twigあたりが有名どころ(最近は新しいのあるのかな?LaravelのBlade、Phalconのvoltとか?)ですが、他のライブラリに依存しないレギュレーションにより、一から作りました。

といっても、JavaScriptのテンプレートエンジンを作ってたこともあって(これです)、それをPHPにポートしました。Handlebarsみたいなもんです。

即時PHPコード(lambda関数)にコンパイルして実行する形式です。一時ファイルを作らずに解析実行するのでお手軽です。が、代わりにテンプレートエラーのハンドリングがしづらくなってしまったので、ここは要改善。まぁまぁ実装は面白いと思うのでよかったらコード見てみてください。

Terrier\Template Class



メール送信


SMTP送信めんどかった。こんなに難しかったっけ…。Gmailのセキュリティポリシーが上がってるのか上手く送信できず、結構試行錯誤しました。やっぱりPHPのソケット対話式通信はもう少しなんとかして欲しい感じ。



まとめ


HTTPベースのアプリケーションを作る上で、リクエスト処理やセッション管理、(今回はやらなかったけど)DB処理、メール送信など、基本的な流れを知ることはとっても大事だと思ってて、安易にコンポーネントを使ってブラックボックス化したままだと見えないこともあるかと。もちろん業務ではこんなことしませんけど…。

こういう知識や経験はどの言語でもシンタックスの違い程度で、あとは同じなので知っておけば他の言語やるときにとっつきやすいです。(という正当化)

せっかくなのでMITライセンスで公開しています。まだテスト全部書いてないので現在ベータリリースですが…。
まだまだ改善の余地はたくさんあるので、使って頂いた方のフィードバックや要望など頂けると嬉しいです。issuesお待ちしていますლ(╹◡╹ლ)

現場からではないですが、以上です。

« 前の記事 次の記事 »

1件のコメント

しゅう さん

初めまして。
今回フォームを実装するにあたり、Terrierを利用させてもらおうと思っているのですが、
一点教えていただきたいことがあります。
入力必須項目のアラート表示について、テンプレートでは{{@data}}でまとめて出力しているようですが、
個別に出力することは可能でしょうか。
「お名前」が未入力ならお名前の下にアラートを表示したい思っています。

初歩的な質問で恐縮ですが、宜しくお願いします。

コメントを投稿する

 画像に表示されている文字を入力してください。