367 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			367 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Illuminate\Support;
 | |
| 
 | |
| use Illuminate\Console\Application as Artisan;
 | |
| use Illuminate\Contracts\Foundation\CachesConfiguration;
 | |
| use Illuminate\Contracts\Foundation\CachesRoutes;
 | |
| use Illuminate\Contracts\Support\DeferrableProvider;
 | |
| use Illuminate\Database\Eloquent\Factory as ModelFactory;
 | |
| use Illuminate\View\Compilers\BladeCompiler;
 | |
| 
 | |
| abstract class ServiceProvider
 | |
| {
 | |
|     /**
 | |
|      * The application instance.
 | |
|      *
 | |
|      * @var \Illuminate\Contracts\Foundation\Application
 | |
|      */
 | |
|     protected $app;
 | |
| 
 | |
|     /**
 | |
|      * The paths that should be published.
 | |
|      *
 | |
|      * @var array
 | |
|      */
 | |
|     public static $publishes = [];
 | |
| 
 | |
|     /**
 | |
|      * The paths that should be published by group.
 | |
|      *
 | |
|      * @var array
 | |
|      */
 | |
|     public static $publishGroups = [];
 | |
| 
 | |
|     /**
 | |
|      * Create a new service provider instance.
 | |
|      *
 | |
|      * @param  \Illuminate\Contracts\Foundation\Application  $app
 | |
|      * @return void
 | |
|      */
 | |
|     public function __construct($app)
 | |
|     {
 | |
|         $this->app = $app;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Register any application services.
 | |
|      *
 | |
|      * @return void
 | |
|      */
 | |
|     public function register()
 | |
|     {
 | |
|         //
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Merge the given configuration with the existing configuration.
 | |
|      *
 | |
|      * @param  string  $path
 | |
|      * @param  string  $key
 | |
|      * @return void
 | |
|      */
 | |
|     protected function mergeConfigFrom($path, $key)
 | |
|     {
 | |
|         if (! ($this->app instanceof CachesConfiguration && $this->app->configurationIsCached())) {
 | |
|             $config = $this->app->make('config');
 | |
| 
 | |
|             $config->set($key, array_merge(
 | |
|                 require $path, $config->get($key, [])
 | |
|             ));
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Load the given routes file if routes are not already cached.
 | |
|      *
 | |
|      * @param  string  $path
 | |
|      * @return void
 | |
|      */
 | |
|     protected function loadRoutesFrom($path)
 | |
|     {
 | |
|         if (! ($this->app instanceof CachesRoutes && $this->app->routesAreCached())) {
 | |
|             require $path;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Register a view file namespace.
 | |
|      *
 | |
|      * @param  string|array  $path
 | |
|      * @param  string  $namespace
 | |
|      * @return void
 | |
|      */
 | |
|     protected function loadViewsFrom($path, $namespace)
 | |
|     {
 | |
|         $this->callAfterResolving('view', function ($view) use ($path, $namespace) {
 | |
|             if (isset($this->app->config['view']['paths']) &&
 | |
|                 is_array($this->app->config['view']['paths'])) {
 | |
|                 foreach ($this->app->config['view']['paths'] as $viewPath) {
 | |
|                     if (is_dir($appPath = $viewPath.'/vendor/'.$namespace)) {
 | |
|                         $view->addNamespace($namespace, $appPath);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             $view->addNamespace($namespace, $path);
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Register the given view components with a custom prefix.
 | |
|      *
 | |
|      * @param  string  $prefix
 | |
|      * @param  array  $components
 | |
|      * @return void
 | |
|      */
 | |
|     protected function loadViewComponentsAs($prefix, array $components)
 | |
|     {
 | |
|         $this->callAfterResolving(BladeCompiler::class, function ($blade) use ($prefix, $components) {
 | |
|             foreach ($components as $alias => $component) {
 | |
|                 $blade->component($component, is_string($alias) ? $alias : null, $prefix);
 | |
|             }
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Register a translation file namespace.
 | |
|      *
 | |
|      * @param  string  $path
 | |
|      * @param  string  $namespace
 | |
|      * @return void
 | |
|      */
 | |
|     protected function loadTranslationsFrom($path, $namespace)
 | |
|     {
 | |
|         $this->callAfterResolving('translator', function ($translator) use ($path, $namespace) {
 | |
|             $translator->addNamespace($namespace, $path);
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Register a JSON translation file path.
 | |
|      *
 | |
|      * @param  string  $path
 | |
|      * @return void
 | |
|      */
 | |
|     protected function loadJsonTranslationsFrom($path)
 | |
|     {
 | |
|         $this->callAfterResolving('translator', function ($translator) use ($path) {
 | |
|             $translator->addJsonPath($path);
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Register database migration paths.
 | |
|      *
 | |
|      * @param  array|string  $paths
 | |
|      * @return void
 | |
|      */
 | |
|     protected function loadMigrationsFrom($paths)
 | |
|     {
 | |
|         $this->callAfterResolving('migrator', function ($migrator) use ($paths) {
 | |
|             foreach ((array) $paths as $path) {
 | |
|                 $migrator->path($path);
 | |
|             }
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Register Eloquent model factory paths.
 | |
|      *
 | |
|      * @param  array|string  $paths
 | |
|      * @return void
 | |
|      */
 | |
|     protected function loadFactoriesFrom($paths)
 | |
|     {
 | |
|         $this->callAfterResolving(ModelFactory::class, function ($factory) use ($paths) {
 | |
|             foreach ((array) $paths as $path) {
 | |
|                 $factory->load($path);
 | |
|             }
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Setup an after resolving listener, or fire immediately if already resolved.
 | |
|      *
 | |
|      * @param  string  $name
 | |
|      * @param  callable  $callback
 | |
|      * @return void
 | |
|      */
 | |
|     protected function callAfterResolving($name, $callback)
 | |
|     {
 | |
|         $this->app->afterResolving($name, $callback);
 | |
| 
 | |
|         if ($this->app->resolved($name)) {
 | |
|             $callback($this->app->make($name), $this->app);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Register paths to be published by the publish command.
 | |
|      *
 | |
|      * @param  array  $paths
 | |
|      * @param  mixed  $groups
 | |
|      * @return void
 | |
|      */
 | |
|     protected function publishes(array $paths, $groups = null)
 | |
|     {
 | |
|         $this->ensurePublishArrayInitialized($class = static::class);
 | |
| 
 | |
|         static::$publishes[$class] = array_merge(static::$publishes[$class], $paths);
 | |
| 
 | |
|         foreach ((array) $groups as $group) {
 | |
|             $this->addPublishGroup($group, $paths);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Ensure the publish array for the service provider is initialized.
 | |
|      *
 | |
|      * @param  string  $class
 | |
|      * @return void
 | |
|      */
 | |
|     protected function ensurePublishArrayInitialized($class)
 | |
|     {
 | |
|         if (! array_key_exists($class, static::$publishes)) {
 | |
|             static::$publishes[$class] = [];
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Add a publish group / tag to the service provider.
 | |
|      *
 | |
|      * @param  string  $group
 | |
|      * @param  array  $paths
 | |
|      * @return void
 | |
|      */
 | |
|     protected function addPublishGroup($group, $paths)
 | |
|     {
 | |
|         if (! array_key_exists($group, static::$publishGroups)) {
 | |
|             static::$publishGroups[$group] = [];
 | |
|         }
 | |
| 
 | |
|         static::$publishGroups[$group] = array_merge(
 | |
|             static::$publishGroups[$group], $paths
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the paths to publish.
 | |
|      *
 | |
|      * @param  string|null  $provider
 | |
|      * @param  string|null  $group
 | |
|      * @return array
 | |
|      */
 | |
|     public static function pathsToPublish($provider = null, $group = null)
 | |
|     {
 | |
|         if (! is_null($paths = static::pathsForProviderOrGroup($provider, $group))) {
 | |
|             return $paths;
 | |
|         }
 | |
| 
 | |
|         return collect(static::$publishes)->reduce(function ($paths, $p) {
 | |
|             return array_merge($paths, $p);
 | |
|         }, []);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the paths for the provider or group (or both).
 | |
|      *
 | |
|      * @param  string|null  $provider
 | |
|      * @param  string|null  $group
 | |
|      * @return array
 | |
|      */
 | |
|     protected static function pathsForProviderOrGroup($provider, $group)
 | |
|     {
 | |
|         if ($provider && $group) {
 | |
|             return static::pathsForProviderAndGroup($provider, $group);
 | |
|         } elseif ($group && array_key_exists($group, static::$publishGroups)) {
 | |
|             return static::$publishGroups[$group];
 | |
|         } elseif ($provider && array_key_exists($provider, static::$publishes)) {
 | |
|             return static::$publishes[$provider];
 | |
|         } elseif ($group || $provider) {
 | |
|             return [];
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the paths for the provider and group.
 | |
|      *
 | |
|      * @param  string  $provider
 | |
|      * @param  string  $group
 | |
|      * @return array
 | |
|      */
 | |
|     protected static function pathsForProviderAndGroup($provider, $group)
 | |
|     {
 | |
|         if (! empty(static::$publishes[$provider]) && ! empty(static::$publishGroups[$group])) {
 | |
|             return array_intersect_key(static::$publishes[$provider], static::$publishGroups[$group]);
 | |
|         }
 | |
| 
 | |
|         return [];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the service providers available for publishing.
 | |
|      *
 | |
|      * @return array
 | |
|      */
 | |
|     public static function publishableProviders()
 | |
|     {
 | |
|         return array_keys(static::$publishes);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the groups available for publishing.
 | |
|      *
 | |
|      * @return array
 | |
|      */
 | |
|     public static function publishableGroups()
 | |
|     {
 | |
|         return array_keys(static::$publishGroups);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Register the package's custom Artisan commands.
 | |
|      *
 | |
|      * @param  array|mixed  $commands
 | |
|      * @return void
 | |
|      */
 | |
|     public function commands($commands)
 | |
|     {
 | |
|         $commands = is_array($commands) ? $commands : func_get_args();
 | |
| 
 | |
|         Artisan::starting(function ($artisan) use ($commands) {
 | |
|             $artisan->resolveCommands($commands);
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the services provided by the provider.
 | |
|      *
 | |
|      * @return array
 | |
|      */
 | |
|     public function provides()
 | |
|     {
 | |
|         return [];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the events that trigger this service provider to register.
 | |
|      *
 | |
|      * @return array
 | |
|      */
 | |
|     public function when()
 | |
|     {
 | |
|         return [];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Determine if the provider is deferred.
 | |
|      *
 | |
|      * @return bool
 | |
|      */
 | |
|     public function isDeferred()
 | |
|     {
 | |
|         return $this instanceof DeferrableProvider;
 | |
|     }
 | |
| }
 |