blessing-skin-server/app/Providers/PluginServiceProvider.php

120 lines
3.7 KiB
PHP
Raw Normal View History

2016-10-17 12:20:55 +08:00
<?php
namespace App\Providers;
use Event;
use App\Events;
2019-02-27 23:44:50 +08:00
use Illuminate\Support\Arr;
2016-10-24 22:32:07 +08:00
use Illuminate\Support\Str;
use App\Services\PluginManager;
2016-10-17 12:20:55 +08:00
use Illuminate\Support\ServiceProvider;
class PluginServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
2016-10-24 22:32:07 +08:00
public function boot(PluginManager $plugins)
2016-10-17 12:20:55 +08:00
{
2018-06-29 15:11:42 +08:00
// Disable plugins which has unsatisfied dependencies
$this->disableRequirementsUnsatisfiedPlugins($plugins);
2018-02-16 17:31:04 +08:00
// Store paths of class files of plugins
$src_paths = [];
$loader = $this->app->make('translation.loader');
2018-02-16 17:31:04 +08:00
// Make view instead of view.finder since the finder is defined as not a singleton
$finder = $this->app->make('view');
2016-10-17 12:20:55 +08:00
foreach ($plugins->getPlugins() as $plugin) {
if ($plugin->isEnabled()) {
$src_paths[$plugin->getNameSpace()] = $plugin->getPath().'/src';
2018-02-16 17:31:04 +08:00
// Add paths of views
$finder->addNamespace($plugin->getNameSpace(), $plugin->getPath().'/views');
}
2018-02-16 17:31:04 +08:00
// Always add paths of translation files for namespace hints
$loader->addNamespace($plugin->getNameSpace(), $plugin->getPath().'/lang');
2016-10-24 22:32:07 +08:00
}
$this->registerPluginCallbackListener();
$this->registerClassAutoloader($src_paths);
2016-10-24 22:32:07 +08:00
2018-06-28 23:32:27 +08:00
// Register plugin's own composer autoloader
foreach ($plugins->getEnabledComposerAutoloaders() as $autoloader) {
require $autoloader;
}
2016-10-24 22:32:07 +08:00
$bootstrappers = $plugins->getEnabledBootstrappers();
2016-10-17 12:20:55 +08:00
foreach ($bootstrappers as $file) {
$bootstrapper = require $file;
2018-02-16 17:31:04 +08:00
// Call closure using service container
2016-10-17 12:20:55 +08:00
$this->app->call($bootstrapper);
}
}
2018-06-29 15:11:42 +08:00
protected function disableRequirementsUnsatisfiedPlugins(PluginManager $manager)
{
foreach ($manager->getEnabledPlugins() as $plugin) {
if (! $manager->isRequirementsSatisfied($plugin)) {
2018-06-29 15:11:42 +08:00
$manager->disable($plugin->name);
}
}
}
protected function registerPluginCallbackListener()
{
Event::listen([
Events\PluginWasEnabled::class,
Events\PluginWasDeleted::class,
Events\PluginWasDisabled::class,
], function ($event) {
2018-02-16 17:31:04 +08:00
// Call callback functions of plugin
if (file_exists($filename = $event->plugin->getPath().'/callbacks.php')) {
$callbacks = require $filename;
2019-02-27 23:44:50 +08:00
$callback = Arr::get($callbacks, get_class($event));
return $callback ? app()->call($callback, [$event->plugin]) : null;
}
});
}
2016-10-24 22:32:07 +08:00
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->singleton('plugins', PluginManager::class);
}
/**
* Register class autoloader for plugins.
*
* @return void
*/
protected function registerClassAutoloader($paths)
{
spl_autoload_register(function ($class) use ($paths) {
2018-02-16 17:31:04 +08:00
// Traverse in registered plugin paths
foreach ((array) array_keys($paths) as $namespace) {
if ($namespace != '' && mb_strpos($class, $namespace) === 0) {
2018-02-16 17:31:04 +08:00
// Parse real file path
$path = $paths[$namespace].Str::replaceFirst($namespace, '', $class).'.php';
$path = str_replace('\\', '/', $path);
if (file_exists($path)) {
2018-02-16 17:31:04 +08:00
// Include class file if it exists
include $path;
}
}
}
});
}
2016-10-17 12:20:55 +08:00
}