Plugin manager can now load, register and boot individual plugins

This commit is contained in:
Samuel Georges 2015-02-12 21:04:27 +11:00
parent 3d04f06ad1
commit c678c965ea
1 changed files with 123 additions and 83 deletions

View File

@ -75,6 +75,7 @@ class PluginManager
/**
* Finds all available plugins and loads them in to the $plugins array.
* @return array
*/
public function loadPlugins()
{
@ -83,39 +84,53 @@ class PluginManager
/**
* Locate all plugins and binds them to the container
*/
foreach ($this->getPluginNamespaces() as $className => $classPath) {
$pluginClassName = $className.'\Plugin';
// Autoloader failed?
if (!class_exists($pluginClassName)) {
include_once $classPath.'/Plugin.php';
}
// Not a valid plugin!
if (!class_exists($pluginClassName)) {
continue;
}
$classObj = new $pluginClassName($this->app);
$classId = $this->getIdentifier($classObj);
/*
* Check for disabled plugins
*/
if ($this->isDisabled($classId)) {
$classObj->disabled = true;
}
$this->plugins[$classId] = $classObj;
$this->pathMap[$classId] = $classPath;
foreach ($this->getPluginNamespaces() as $namespace => $path) {
$this->loadPlugin($namespace, $path);
}
return $this->plugins;
}
/**
* Loads a single plugin in to the manager.
* @param string $namespace Eg: Acme\Blog
* @param string $path Eg: plugins_path().'/acme/blog';
* @return void
*/
public function loadPlugin($namespace, $path)
{
$className = $namespace.'\Plugin';
$classPath = $path.'/Plugin.php';
// Autoloader failed?
if (!class_exists($className)) {
include_once $classPath;
}
// Not a valid plugin!
if (!class_exists($className)) {
return;
}
$classObj = new $className($this->app);
$classId = $this->getIdentifier($classObj);
/*
* Check for disabled plugins
*/
if ($this->isDisabled($classId)) {
$classObj->disabled = true;
}
$this->plugins[$classId] = $classObj;
$this->pathMap[$classId] = $path;
return $classObj;
}
/**
* Runs the register() method on all plugins. Can only be called once.
* @return void
*/
public function registerAll()
{
@ -124,61 +139,76 @@ class PluginManager
}
foreach ($this->plugins as $pluginId => $plugin) {
if ($plugin->disabled) {
continue;
}
if (!self::$noInit) {
$plugin->register();
}
$pluginPath = $this->getPluginPath($plugin);
$pluginNamespace = strtolower($pluginId);
/*
* Register plugin class autoloaders
*/
$autoloadPath = $pluginPath . '/vendor/autoload.php';
if (File::isFile($autoloadPath)) {
require_once $autoloadPath;
}
/*
* Register language namespaces
*/
$langPath = $pluginPath . '/lang';
if (File::isDirectory($langPath)) {
Lang::addNamespace($pluginNamespace, $langPath);
}
/*
* Register configuration path
*/
$configPath = $pluginPath . '/config';
if (File::isDirectory($configPath)) {
Config::package($pluginNamespace, $configPath, $pluginNamespace);
}
/*
* Register views path
*/
$viewsPath = $pluginPath . '/views';
if (File::isDirectory($viewsPath)) {
View::addNamespace($pluginNamespace, $viewsPath);
}
/*
* Add routes, if available
*/
$routesFile = $pluginPath . '/routes.php';
if (File::exists($routesFile)) {
require $routesFile;
}
$this->registerPlugin($plugin, $pluginId);
}
$this->registered = true;
}
/**
* Registers a single plugin object.
* @param PluginBase $plugin
* @param string $pluginId
* @return void
*/
public function registerPlugin($plugin, $pluginId = null)
{
if (!$pluginId) {
$pluginId = $this->getIdentifier($plugin);
}
if (!$plugin || $plugin->disabled) {
return;
}
if (!self::$noInit) {
$plugin->register();
}
$pluginPath = $this->getPluginPath($plugin);
$pluginNamespace = strtolower($pluginId);
/*
* Register plugin class autoloaders
*/
$autoloadPath = $pluginPath . '/vendor/autoload.php';
if (File::isFile($autoloadPath)) {
require_once $autoloadPath;
}
/*
* Register language namespaces
*/
$langPath = $pluginPath . '/lang';
if (File::isDirectory($langPath)) {
Lang::addNamespace($pluginNamespace, $langPath);
}
/*
* Register configuration path
*/
$configPath = $pluginPath . '/config';
if (File::isDirectory($configPath)) {
Config::package($pluginNamespace, $configPath, $pluginNamespace);
}
/*
* Register views path
*/
$viewsPath = $pluginPath . '/views';
if (File::isDirectory($viewsPath)) {
View::addNamespace($pluginNamespace, $viewsPath);
}
/*
* Add routes, if available
*/
$routesFile = $pluginPath . '/routes.php';
if (File::exists($routesFile)) {
require $routesFile;
}
}
/**
* Runs the boot() method on all plugins. Can only be called once.
*/
@ -189,18 +219,28 @@ class PluginManager
}
foreach ($this->plugins as $plugin) {
if ($plugin->disabled) {
continue;
}
if (!self::$noInit) {
$plugin->boot();
}
$this->bootPlugin($plugin);
}
$this->booted = true;
}
/**
* Registers a single plugin object.
* @param PluginBase $plugin
* @return void
*/
public function bootPlugin($plugin)
{
if (!$plugin || $plugin->disabled) {
return;
}
if (!self::$noInit) {
$plugin->boot();
}
}
/**
* Returns the directory path to a plugin
*/