StocksNew/vendor/php-flasher/flasher-laravel/Support/ServiceProvider.php
Sampanna Rimal 53c0140f58 first commit
2024-08-27 17:48:06 +05:45

229 lines
5.5 KiB
PHP

<?php
/*
* This file is part of the PHPFlasher package.
* (c) Younes KHOUBZA <younes.khoubza@gmail.com>
*/
namespace Flasher\Laravel\Support;
use Flasher\Prime\FlasherInterface;
use Flasher\Prime\Plugin\PluginInterface;
use Flasher\Prime\Response\Resource\ResourceManagerInterface;
use Illuminate\Container\Container;
use Illuminate\Contracts\Config\Repository;
use Illuminate\Support\ServiceProvider as BaseServiceProvider;
abstract class ServiceProvider extends BaseServiceProvider
{
/**
* @var PluginInterface|null
*/
protected $plugin;
/**
* {@inheritdoc}
*/
public function register()
{
$this->plugin = $this->plugin ?: $this->createPlugin();
$this->processConfiguration();
$this->afterRegister();
}
/**
* @return void
*/
public function boot()
{
$this->registerPublishing();
$this->registerFactory();
$this->afterBoot();
}
/**
* @return PluginInterface
*/
abstract public function createPlugin();
/**
* @return string
*/
public function getConfigurationFile()
{
return rtrim($this->getResourcesDir(), '/').'/config.php';
}
/**
* @return void
*/
protected function registerPublishing()
{
if (!in_array(\PHP_SAPI, array('cli', 'phpdbg'))) {
return;
}
if (Laravel::isVersion('4')) {
return;
}
$this->publishConfiguration();
$this->publishAssets();
}
/**
* @return void
*/
protected function publishConfiguration()
{
if (null === $this->plugin) {
return;
}
$file = $this->getConfigurationFile();
if (!file_exists($file)) {
return;
}
$paths = array($file => config_path($this->plugin->getName().'.php'));
$this->publishes($paths);
$groups = array(
'flasher-config',
str_replace('_', '-', $this->plugin->getName()).'-config',
);
foreach ($groups as $group) {
if (!array_key_exists($group, static::$publishGroups)) {
static::$publishGroups[$group] = array();
}
static::$publishGroups[$group] = array_merge(static::$publishGroups[$group], $paths);
}
}
/**
* @return void
*/
protected function publishAssets()
{
if (null === $this->plugin) {
return;
}
$dir = $this->plugin->getAssetsDir();
if (!is_dir($dir)) {
return;
}
$paths = array($dir => public_path('vendor/flasher/'));
$this->publishes($paths);
$groups = array(
'flasher-assets',
str_replace('_', '-', $this->plugin->getName()).'-assets',
);
foreach ($groups as $group) {
if (!array_key_exists($group, static::$publishGroups)) {
static::$publishGroups[$group] = array();
}
static::$publishGroups[$group] = array_merge(static::$publishGroups[$group], $paths);
}
}
/**
* @return string
*/
protected function getResourcesDir()
{
$r = new \ReflectionClass($this);
return pathinfo($r->getFileName() ?: '', PATHINFO_DIRNAME).'/Resources/';
}
/**
* @return void
*/
protected function processConfiguration()
{
if (null === $this->plugin) {
return;
}
/** @var Repository $config */
$config = $this->app->make('config');
$name = $this->plugin->getName();
/** @var array<string, mixed> $configuration */
$configuration = $config->get($name, array());
$config->set($name, $this->plugin->processConfiguration($configuration));
}
/**
* @return void
*/
protected function afterRegister()
{
}
/**
* @return void
*/
protected function afterBoot()
{
}
/**
* @return void
*/
protected function registerFactory()
{
$plugin = $this->plugin;
if (null === $plugin) {
return;
}
if (!class_exists($plugin->getFactory())) {
return;
}
$this->app->singleton($plugin->getServiceID(), function (Container $app) use ($plugin) {
$factory = $plugin->getFactory();
return new $factory($app->make('flasher.storage_manager'));
});
$this->app->alias($plugin->getServiceID(), $plugin->getFactory());
$this->app->extend('flasher', function (FlasherInterface $flasher, Container $app) use ($plugin) {
$flasher->addFactory($plugin->getAlias(), $app->make($plugin->getServiceID())); // @phpstan-ignore-line
return $flasher;
});
$config = $this->app->make('config')->get($this->plugin->getName(), array()); // @phpstan-ignore-line
$this->app->extend('flasher.resource_manager', function (ResourceManagerInterface $manager) use ($plugin, $config) {
$config = $plugin->normalizeConfig($config);
$scripts = isset($config['scripts']) ? $config['scripts'] : array();
$manager->addScripts($plugin->getAlias(), $scripts);
$styles = isset($config['styles']) ? $config['styles'] : array();
$manager->addStyles($plugin->getAlias(), $styles);
$options = isset($config['options']) ? $config['options'] : array();
$manager->addOptions($plugin->getAlias(), $options);
return $manager;
});
}
}