laravel5.1のサービスプロバイダについて調べてみた(カスタムバリデーターをサービスプロバイダで実装しようとしたけど、上手くいかなかったのでデフォルトのapp/Providers/AppServiceProvider.phpに記述した)
質問その1、そもそも、サービスプロバイダって何?
回答その1、一言でいうとクラスです(必ずServiceProviderクラスを継承する)。何らかに機能(サービス)を提供してくれるので、この名称らしい。
質問その2、ただのクラスとは、何が違うのか?
回答その2、laravelの機能はサービス・プロバイダー単位でまとまっているので、laravelに機能追加したい場合には同じ形式にする必要がある!(ライブラリーや関数と同じ考え方)
質問その3、具体的に、どうやって作るのか?
回答その3、コマンドラインから、例によってartisanで作る
php artisan make:provider 好きな名前ServiceProvider
具体例)
php artisan make:provider PasswordValidateServiceProvider
質問その4、app/Providers/PasswordValidateServiceProvider.phpが生成されたけど、この後はどうすれば…。
回答その4、laravelで使えるように登録する! config/app.phpに登録しないと、プロジェクトに追加しても利用出来ない!
1 2 3 4 |
'providers' => [ // これで正しいと思うけど、laravelに認識されていないっぽい 'App\Providers\PasswordValidateServiceProvider', ] |
質問その5、クラス内に、registerとbootという2種類のメソッドがあるけど、何?
回答その5、どちらも初期化処理。registerメソッドは必須。bootメソッドはオプションなので、実は無くてもOK。register -> bootの順で実行される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class PasswordValidateServiceProvider extends ServiceProvider { /** * Bootstrap the application services. * * @return void */ public function boot() { // } /** * Register the application services. * * @return void */ public function register() { // } } |
質問その6、具体的に、何を記述すればいいのか?
回答その6、基本的には各サービスの初期化処理を行う。例えばカスタムバリデーター(入力チェック)は、以下の様な感じ。
1 2 3 4 5 6 |
public function boot() { $this->app['validator']->resolver(function($translator, $data, $rules, $messages) { return new App\CustomValidator($translator, $data, $rules, $messages); }); } |
上記のカスタムバリデーターの実装クラス(appフォルダ直下に自分で作る)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php namespace App; class CustomValidator extends \Illuminate\Validation\Validator { /** * @param $attribute * @param $value * @param $parameters * @return int */ public function validateJpZipCode($attribute, $value, $parameters) { return preg_match("/^[0-9\-]{7,8}+$/i", $value); } } |
質問その7、エラーメッセージは、どこに記述すればいいのか?
回答その7、エラーメッセージは、resource/lang/ja/validation.phpで定義する(無くても動作はする)
1 2 3 4 5 |
'custom' => [ 'postal_code' => [ 'jp_zip_code' => ':attributeを正しく入力して下さい', ], ], |
質問その8、実際に使うには?
回答その8、標準のvalidateの指定と全く同じ。
1 2 3 4 5 6 7 8 |
$rules = [ 'username' => ['required'], 'postal_code' => ['required', 'JpZipCode'], ]; // 問題があったら、元ページに戻る $this->validate($request, $rules); |
質問その9、Method [validateJpZipCode] does not exist.とか、そんなvalidate無いよ!ってエラーが出るんだけど…。
回答その9、ここでつまづいた…。config/app.phpが上手く登録されていない?
最初からある、app/Providers/AppServiceProviderのbootに記述したら上手くいったので、とりあえずこれで実装する!
全体的な流れ
config/app.phpに登録→PasswordValidateServiceProvider->regbootister()で、CustomValidatorクラスが読み込まれる(ここで、ようやくvalidateJpZipCodeというカスタムバリデーターが登場!)
実際には、上記だと上手くいかなかったのでデフォルトのapp/Providers/AppServiceProvider.phpを利用した
※独自サービスプロバイダを作らなくていいので楽だけど、処理が多くなったら分割すべき
参考URL:Laravel4, 5 カスタムバリデートの実装