はじめに
こんばんは。
ただの紹介ブログです。
前回の記事で紹介した、JsonSchemaを使用するLaravelのリクエストレスポンスの型チェックをpackagistに公開してみました。
コチラです。
せっかくなので自分で書いたREADMEに沿ってやってみます。
やってみた
インストール
$ composer require kojirock5260/laravel-json-schema-validate Using version ^1.0 for kojirock5260/laravel-json-schema-validate ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 1 install, 0 updates, 0 removals - Installing kojirock5260/laravel-json-schema-validate (v1.0): Downloading (100%) Writing lock file Generating optimized autoload files > Illuminate\Foundation\ComposerScripts::postAutoloadDump > @php artisan package:discover --ansi Discovered Package: aws/aws-sdk-php-laravel Discovered Package: barryvdh/laravel-cors Discovered Package: barryvdh/laravel-ide-helper Discovered Package: beyondcode/laravel-dump-server Discovered Package: fideloper/proxy Discovered Package: kojirock5260/laravel-json-schema-validate Discovered Package: mpociot/laravel-apidoc-generator Discovered Package: nesbot/carbon Discovered Package: nunomaduro/collision Discovered Package: nunomaduro/larastan Discovered Package: sentry/sentry-laravel Discovered Package: tymon/jwt-auth Discovered Package: xethron/migrations-generator Package manifest generated successfully. ocramius/package-versions: Generating version class... ocramius/package-versions: ...done generating version class ——
config追加
$ php artisan vendor:publish --provider=Kojirock\\JsonSchemaServiceProvider Copied File [/vendor/kojirock5260/laravel-json-schema-validate/config/json-schema.php] To [/config/json-schema.php] Publishing complete.
こちらのconfigはほぼほぼ何もありません。 middleware内で投げられる例外クラスを指定できるだけです。
<?php declare(strict_types=1); return [ 'exception' => Kojirock\Exception\JsonSchemaException::class ];
今回自分が作ったライブラリは justinrainbow/json-schema
というライブラリに依存しています。
コチラの現在のlatestバージョンではエラーメッセージを指定できない仕様となっています。
このあたりとかで、直接エラーメッセージを登録しています↓
開発していた際に、日本語でエラーメッセージを返したいなとなり、例外を拡張してエラーメッセージをカスタムできるように自分でもしていたので、もし誰が使うとなった場合多分その需要はありそうだなと思い、指定できるように変更しました。
ただ、issueがあがっているので、対応された場合はこの指定は必要なくなると思います。
middleware追加
app/Http/Kernel.phpを修正します。
protected $routeMiddleware = [ ... 'json_schema' => \Kojirock\Middleware\JsonSchemaValidate::class, ];
routesに設定
<?php Route::group(['middleware' => ['json_schema']], function () { Route::get('/member', 'MemberController@index')->name('MemberList'); });
schemaクラスを追加
デフォルトで App\Http\Schema\Request
にRequest用、 App\Http\Schema\Response
にResponse用のスキーマクラスを作ります。
<?php declare(strict_types=1); namespace App\Http\Schema\Request; use Kojirock\SchemaInterface; class MemberListSchema implements SchemaInterface { public static function getSchema(): array { return [ '$schema' => 'http://json-schema.org/draft-07/schema#', 'required' => ['page'], 'type' => 'object', 'properties' => [ 'page' => [ 'type' => 'string', 'pattern' => '^([1-9]|[1-9][0-9]*)$', ], 'employment' => [ 'type' => 'string', 'enum' => array_map('strval', array_keys(\App\Models\Member::EMPLOYMENT_LIST)), ], 'department' => [ 'type' => 'string', 'enum' => array_map('strval', array_keys(\App\Models\Member::DEPARTMENT_LIST)), ], 'mailAddress' => [ 'type' => 'string', 'format' => 'email' ], ], ]; } }
これでAPIを実行してみると、リクエスト・レスポンスの方のチェックをしてくれます。
Schemaクラスの格納場所はデフォルトで App\Http\Schema\
になりますが、APIのエンドポイントが増えるとものすごい増えていくと思います。
Schemaクラスの指定methodをオーバーライドしてあげれば、自由に格納場所を設定できます。
https://github.com/kojirock5260/laravel-json-schema-validate#schema-directory-customise
終わりに
前回の記事を書いた後気になった部分や、カスタマイズしたいなと思った部分などを盛り込んで、やってみました。
勢いだけでやったのでtestをかけてないのがダメダメな部分です...
テスト書いたらまたアップデートしようと思います...
現場からは以上です。