退屈な名前の入力検証フレームワーク
Changelog
入力検証は、あらゆるWebアプリケーションで重要なタスクですが、非常に退屈なタスクのままです。これにより、必要な入力とオプションの入力を明確に定義する適切なデータ構造に、混ざり合ったチェックを置き換えます。
デザインは、各APIエンドポイントが独自のオブジェクトであるAPI駆動型のデザインのアイデアを中心に再現しますが、この形式は明示的に必要ありません
生の入力は、2つの主要なステップで安全なデータに変換されます。
解析は、生の入力文字列を連想配列に変換する責任があります。アプリケーションがそのように構造化されている場合、このステップは完全にスキップできます。
検証は、ライブラリの最も有用な部分です - 定義されたオプションのパラメーターと必要なパラメーターとそのタイプを使用し、入力値を仕様と比較します。実装により、データが完全に伝播されるのを防ぎます。無効なデータからSafeInputオブジェクト(アプリケーションが使用する)を作成することはできません!
このプロセスが完了すると、 ValidationInterfaceを実装するオブジェクトによって定義された仕様に従ってデータを含むSafeInputオブジェクトが返されます(オプションの値が欠落していることはnull)。
このライブラリは信頼できるデータを提供するために存在するため、2番目の推測を積極的に妨げます。たとえば、データ構造でissetまたはempty使用を使用すると、例外がスローされます。あなたの検証済みデータを信頼できない行動は、アンチパターンとコードの匂いであるというのは著者の経験です。あなたがそうすることを主張するなら、これはあなたにとって正しいツールではありません。このように信頼を強制することは、現実とは別にドキュメントが干渉するのを防ぐ傾向があります。
基本的な例が次のとおりです。
some_controller_file.php
<?php
// This would be in its own file
use Firehed Input Interfaces ValidationInterface ;
use Firehed Input Containers SafeInput ;
use Firehed Input Objects as O ;
class Endpoint
implements ValidationInterface {
public function getOptionalInputs () {
return [
' bar ' => new O Text (),
' baz ' => ( new O Text ())-> setDefaultValue ( ' my baz ' ),
];
}
public function getRequiredInputs () {
return [
' foo ' => new O Text (),
];
}
public function execute ( SafeInput $ i ) {
// ... do some magic
// $i['foo'] will be a string
// $i['bar'] will be a string or null, since it was optional
// $i['baz'] will be a string or 'my baz', since it was an optional with a default value
}
} index.php
<?php
// This is the core of your Front Controller
use Firehed Input Containers RawInput ;
use Firehed Input Parsers URLEncoded ;
// The endpoint should be detrmined by your router
$ endpoint = new Endpoint ();
// The parser should be determined by the Content-Type header
$ parser = new URLEncoded ();
try {
$ input = ( new RawInput ( " foo=world " ))
-> parse ( $ parser )
-> validate ( $ endpoint );
$ endpoint -> execute ( $ input );
} catch ( Firehed Input Exceptions InputException $ e ) {
// The input contained invalid data
} catch ( Exception $ e ) {
// Do any logging, error responses, etc.
echo $ e ;
}