もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

laravelのjsonSchemaValidateをpublicにした

はじめに

こんばんは。

ただの紹介ブログです。

前回の記事で紹介した、JsonSchemaを使用するLaravelのリクエストレスポンスの型チェックをpackagistに公開してみました。

kojirooooocks.hatenablog.com

コチラです。

packagist.org

せっかくなので自分で書いた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 というライブラリに依存しています。

packagist.org

コチラの現在のlatestバージョンではエラーメッセージを指定できない仕様となっています。

このあたりとかで、直接エラーメッセージを登録しています↓

https://github.com/justinrainbow/json-schema/blob/5.2.8/src/JsonSchema/Constraints/ObjectConstraint.php#L69

開発していた際に、日本語でエラーメッセージを返したいなとなり、例外を拡張してエラーメッセージをカスタムできるように自分でもしていたので、もし誰が使うとなった場合多分その需要はありそうだなと思い、指定できるように変更しました。

ただ、issueがあがっているので、対応された場合はこの指定は必要なくなると思います。

github.com

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をかけてないのがダメダメな部分です...

テスト書いたらまたアップデートしようと思います...

現場からは以上です。