<?php

namespace Illuminate\Validation;

use Illuminate\Support\ServiceProvider;
// just namespace
class ValidationServiceProvider extends ServiceProvider
{// a class extends a standard class
    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;// Indicates if loading of the provider is deferred.

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->registerPresenceVerifier();// register Presence Verifier

        $this->registerValidationFactory();// register validation Factory
    }// Register the service provider.

    /**
     * Register the validation factory.
     *
     * @return void
     */
    protected function registerValidationFactory()
    {
        $this->app->singleton('validator', function ($app) {
            $validator = new Factory($app['translator'], $app);// get instance of the

            // The validation presence verifier is responsible for determining the existence
            // of values in a given data collection, typically a relational database or
            // other persistent data stores. And it is used to check for uniqueness.
            if (isset($app['validation.presence'])) {// has it
                $validator->setPresenceVerifier($app['validation.presence']);//and set it
            }// if has a other way to get it

            return $validator;// return it
        });// set the singleton
    }// Register the validation factory.

    /**
     * Register the database presence verifier.
     *
     * @return void
     */
    protected function registerPresenceVerifier()
    {
        $this->app->singleton('validation.presence', function ($app) {
            return new DatabasePresenceVerifier($app['db']);
        });// like set a singleton
    }//Register the database presence verifier.

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return [
            'validator', 'validation.presence',
        ];
    }// get return
}