diff --git a/src/DoctrineServiceProvider.php b/src/DoctrineServiceProvider.php index b7e11726..0d333127 100644 --- a/src/DoctrineServiceProvider.php +++ b/src/DoctrineServiceProvider.php @@ -54,6 +54,8 @@ public function boot() $this->getConfigPath() => config_path('doctrine.php'), ], 'config'); } + + $this->ensureValidatorIsUsable(); } /** @@ -81,6 +83,26 @@ public function register() } } + protected function ensureValidatorIsUsable() + { + if(!$this->isLumen()) { + return; + } + + if($this->shouldRegisterDoctrinePresenceValidator()) { + // due to weirdness the default presence verifier overrides one set by a service provider + // so remove them so we can re add our implementation later + unset($this->app->availableBindings['validator']); + unset($this->app->availableBindings['Illuminate\Contracts\Validation\Factory']); + } else { + // resolve the db, + // this makes `isset($this->app['db']) == true` + // which is required to set the presence verifier + // in the default ValidationServiceProvider implementation + $this->app['db']; + } + } + /** * Merge config */ @@ -202,7 +224,11 @@ protected function registerExtensions() */ protected function registerPresenceVerifierProvider() { - $this->app->register(PresenceVerifierProvider::class); + $this->app->singleton('validator', function () { + $this->app->register(PresenceVerifierProvider::class); + + return $this->app->make('validator'); + }); } /** diff --git a/src/Validation/PresenceVerifierProvider.php b/src/Validation/PresenceVerifierProvider.php index 0d44828a..90c9abee 100644 --- a/src/Validation/PresenceVerifierProvider.php +++ b/src/Validation/PresenceVerifierProvider.php @@ -2,6 +2,7 @@ namespace LaravelDoctrine\ORM\Validation; +use Illuminate\Validation\Factory; use Illuminate\Validation\ValidationServiceProvider; class PresenceVerifierProvider extends ValidationServiceProvider @@ -13,6 +14,27 @@ class PresenceVerifierProvider extends ValidationServiceProvider */ protected $defer = true; + /** + * Register the validation factory. + * + * @return void + */ + protected function registerValidationFactory() + { + $this->app->singleton('validator', function ($app) { + $validator = new Factory($app['translator'], $app); + + // The validation presence verifier is responsible for determining the existence of + // values in a given data collection which is typically a relational database or + // other persistent data stores. It is used to check for "uniqueness" as well. + if (isset($app['registry']) && isset($app['validation.presence'])) { + $validator->setPresenceVerifier($app['validation.presence']); + } + + return $validator; + }); + } + /** * Register the database presence verifier. *