add class autoloader for plugins
This commit is contained in:
parent
84e4d97f00
commit
329f4c86bc
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
namespace App\Providers;
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
use App\Services\PluginManager;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
|
||||
class PluginServiceProvider extends ServiceProvider
|
||||
|
|
@ -11,9 +13,38 @@ class PluginServiceProvider extends ServiceProvider
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function boot()
|
||||
public function boot(PluginManager $plugins)
|
||||
{
|
||||
//
|
||||
$namespaces = [];
|
||||
|
||||
foreach ($plugins->getPlugins() as $plugin) {
|
||||
$namespaces[$plugin->getNameSpace()] = $plugin->getPath()."/src";
|
||||
}
|
||||
|
||||
// register class autoloader for plugins
|
||||
spl_autoload_register(function($class) use ($namespaces) {
|
||||
// traverse in registered plugin namespaces
|
||||
foreach ((array) array_keys($namespaces) as $namespace) {
|
||||
if ($namespace != '' && mb_strpos($class, $namespace) === 0) {
|
||||
// parse real file path
|
||||
$path = $namespaces[$namespace].Str::replaceFirst($namespace, '', $class).".php";
|
||||
$path = str_replace('\\', '/', $path);
|
||||
|
||||
if (file_exists($path)) {
|
||||
include $path;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$bootstrappers = $plugins->getEnabledBootstrappers();
|
||||
|
||||
foreach ($bootstrappers as $file) {
|
||||
// bootstraper is a closure
|
||||
$bootstrapper = require $file;
|
||||
|
||||
$this->app->call($bootstrapper);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -23,15 +54,6 @@ class PluginServiceProvider extends ServiceProvider
|
|||
*/
|
||||
public function register()
|
||||
{
|
||||
$this->app->bind('plugins', 'App\Services\PluginManager');
|
||||
|
||||
$bootstrappers = $this->app->make('plugins')->getEnabledBootstrappers();
|
||||
|
||||
foreach ($bootstrappers as $file) {
|
||||
// bootstraper is a closure
|
||||
$bootstrapper = require $file;
|
||||
|
||||
$this->app->call($bootstrapper);
|
||||
}
|
||||
$this->app->singleton('plugins', PluginManager::class);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,29 +2,15 @@
|
|||
|
||||
namespace App\Services;
|
||||
|
||||
use Illuminate\Contracts\Support\Arrayable;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Contracts\Support\Arrayable;
|
||||
|
||||
/**
|
||||
* @property string $name
|
||||
* @property string $description
|
||||
* @property string $type
|
||||
* @property array $keywords
|
||||
* @property string $homepage
|
||||
* @property string $time
|
||||
* @property string $license
|
||||
* @property array $authors
|
||||
* @property array $support
|
||||
* @property array $require
|
||||
* @property array $requireDev
|
||||
* @property array $autoload
|
||||
* @property array $autoloadDev
|
||||
* @property array $conflict
|
||||
* @property array $replace
|
||||
* @property array $provide
|
||||
* @property array $suggest
|
||||
* @property array $extra
|
||||
* @property string $title
|
||||
* @property array $author
|
||||
*/
|
||||
class Plugin implements Arrayable
|
||||
{
|
||||
|
|
@ -56,6 +42,13 @@ class Plugin implements Arrayable
|
|||
*/
|
||||
protected $version;
|
||||
|
||||
/**
|
||||
* The namespace used by the plugin.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $namespace;
|
||||
|
||||
/**
|
||||
* Whether the plugin is enabled.
|
||||
*
|
||||
|
|
@ -121,7 +114,20 @@ class Plugin implements Arrayable
|
|||
return $this->installed;
|
||||
}
|
||||
|
||||
public function getViewPath($name) {
|
||||
public function getNameSpace()
|
||||
{
|
||||
return $this->namespace;
|
||||
}
|
||||
|
||||
public function setNameSpace($namespace)
|
||||
{
|
||||
$this->namespace = $namespace;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getViewPath($name)
|
||||
{
|
||||
return $this->path."/views/$name.tpl";
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,22 +2,28 @@
|
|||
|
||||
namespace App\Services;
|
||||
|
||||
use Illuminate\Contracts\Foundation\Application;
|
||||
use Illuminate\Contracts\Events\Dispatcher;
|
||||
use Illuminate\Filesystem\Filesystem;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Collection;
|
||||
use App\Services\Repositories\OptionRepository;
|
||||
use App\Events\PluginWasDisabled;
|
||||
use App\Events\PluginWasEnabled;
|
||||
use App\Events\PluginWasDisabled;
|
||||
use Illuminate\Support\Collection;
|
||||
use App\Events\PluginWasUninstalled;
|
||||
use Illuminate\Filesystem\Filesystem;
|
||||
use Illuminate\Contracts\Events\Dispatcher;
|
||||
use App\Services\Repositories\OptionRepository;
|
||||
use Illuminate\Contracts\Foundation\Application;
|
||||
|
||||
class PluginManager
|
||||
{
|
||||
protected $option;
|
||||
|
||||
/**
|
||||
* @var Application
|
||||
*/
|
||||
protected $app;
|
||||
|
||||
/**
|
||||
* @var OptionRepository
|
||||
*/
|
||||
protected $option;
|
||||
|
||||
/**
|
||||
* @var Dispatcher
|
||||
*/
|
||||
|
|
@ -34,13 +40,13 @@ class PluginManager
|
|||
protected $plugins;
|
||||
|
||||
public function __construct(
|
||||
OptionRepository $option,
|
||||
Application $app,
|
||||
OptionRepository $option,
|
||||
Dispatcher $dispatcher,
|
||||
Filesystem $filesystem
|
||||
) {
|
||||
$this->option = $option;
|
||||
$this->app = $app;
|
||||
$this->app = $app;
|
||||
$this->option = $option;
|
||||
$this->dispatcher = $dispatcher;
|
||||
$this->filesystem = $filesystem;
|
||||
}
|
||||
|
|
@ -80,6 +86,7 @@ class PluginManager
|
|||
|
||||
// Per default all plugins are installed if they are registered in composer.
|
||||
$plugin->setInstalled(true);
|
||||
$plugin->setNameSpace(Arr::get($package, 'namespace'));
|
||||
$plugin->setVersion(Arr::get($package, 'version'));
|
||||
$plugin->setEnabled($this->isEnabled($plugin->name));
|
||||
|
||||
|
|
@ -119,10 +126,6 @@ class PluginManager
|
|||
|
||||
$enabled[] = $name;
|
||||
|
||||
// $this->migrate($plugin);
|
||||
|
||||
// $this->publishAssets($plugin);
|
||||
|
||||
$this->setEnabled($enabled);
|
||||
|
||||
$plugin->setEnabled(true);
|
||||
|
|
@ -164,12 +167,6 @@ class PluginManager
|
|||
|
||||
$this->disable($name);
|
||||
|
||||
// $this->migrateDown($plugin);
|
||||
|
||||
// $this->unpublishAssets($plugin);
|
||||
|
||||
// $plugin->setInstalled(false);
|
||||
|
||||
$this->filesystem->deleteDirectory($plugin->getPath());
|
||||
|
||||
// refresh plugin list
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user