* @copyright Mollie B.V. * @link https://www.mollie.com */ namespace Mollie\Laravel; use Illuminate\Contracts\Container\Container; use Illuminate\Foundation\Application as LaravelApplication; use Illuminate\Support\ServiceProvider; use Laravel\Lumen\Application as LumenApplication; use Mollie\Api\MollieApiClient; use Mollie\Laravel\Wrappers\MollieApiWrapper; /** * Class MollieServiceProvider. */ class MollieServiceProvider extends ServiceProvider { /** * Indicates if loading of the provider is deferred. * * @var bool */ protected $defer = true; /** * Boot the service provider. * * @return void */ public function boot() { $this->setupConfig(); $this->extendSocialite(); } /** * Setup the config. * * @return void */ protected function setupConfig() { $source = realpath(__DIR__ . '/../config/mollie.php'); // Check if the application is a Laravel OR Lumen instance to properly merge the configuration file. if ($this->app instanceof LaravelApplication && $this->app->runningInConsole()) { $this->publishes([$source => config_path('mollie.php')]); } elseif ($this->app instanceof LumenApplication) { $this->app->configure('mollie'); } $this->mergeConfigFrom($source, 'mollie'); } /** * Extend the Laravel Socialite factory class, if available. * * @return void */ protected function extendSocialite() { if (interface_exists('Laravel\Socialite\Contracts\Factory')) { $socialite = $this->app->make('Laravel\Socialite\Contracts\Factory'); $socialite->extend('mollie', function (Container $app) use ($socialite) { $config = $app['config']['services.mollie']; return $socialite->buildProvider(MollieConnectProvider::class, $config); }); } } /** * Register the service provider. * * @return void */ public function register() { $this->registerApiClient(); $this->registerApiAdapter(); $this->registerManager(); } /** * Register the Mollie API adapter class. * * @return void */ protected function registerApiAdapter() { $this->app->singleton('mollie.api', function (Container $app) { $config = $app['config']; return new MollieApiWrapper($config, $app['mollie.api.client']); }); $this->app->alias('mollie.api', MollieApiWrapper::class); } /** * Register the Mollie API Client. * * @return void */ protected function registerApiClient() { $this->app->singleton('mollie.api.client', function () { return new MollieApiClient(); }); $this->app->alias('mollie.api.client', MollieApiClient::class); } /** * Register the manager class. * * @return void */ public function registerManager() { $this->app->singleton('mollie', function (Container $app) { return new MollieManager($app); }); $this->app->alias('mollie', MollieManager::class); } /** * Get the services provided by the provider. * * @return array */ public function provides() { return [ 'mollie', 'mollie.api', 'mollie.api.client', ]; } }