Pico::loadLocalPlugins(): Don't load plugins case-insensitive

The performance vs. error-proneness trade-off doesn't justify this additional complexity. This is Pico 2.0, we always try to minimize BC-breaking changes, but we're breaking BC anyway by loading plugins from plugins/<plugin name>/<plugin name>.php only...
pico-3.0-alpha
Daniel Rudolf 8 years ago
parent b6468ca215
commit 20297deaec
No known key found for this signature in database
GPG Key ID: A061F02CD8DE4538
  1. 57
      lib/Pico.php

@ -540,7 +540,13 @@ class Pico
*/ */
protected function loadLocalPlugins() protected function loadLocalPlugins()
{ {
$pluginsLowered = array_change_key_case($this->plugins, CASE_LOWER); // scope isolated require()
$includeClosure = function ($pluginFile) {
require($pluginFile);
};
if (PHP_VERSION_ID >= 50400) {
$includeClosure = $includeClosure->bindTo(null);
}
$pluginFiles = array(); $pluginFiles = array();
$files = scandir($this->getPluginsDir()) ?: array(); $files = scandir($this->getPluginsDir()) ?: array();
@ -549,56 +555,27 @@ class Pico
continue; continue;
} }
$className = $pluginFile = null;
if (is_dir($this->getPluginsDir() . $file)) { if (is_dir($this->getPluginsDir() . $file)) {
$className = preg_replace('/^[0-9]+-/', '', $file); $className = preg_replace('/^[0-9]+-/', '', $file);
$classNameLowered = strtolower($className); $pluginFile = $file . '/' . $className . '.php';
if (isset($pluginsLowered[$classNameLowered])) {
continue;
}
if (file_exists($this->getPluginsDir() . $file . '/' . $className . '.php')) {
$pluginFiles[$className] = $file . '/' . $className . '.php';
} else {
$subdirFiles = $this->getFilesGlob($this->getPluginsDir() . $file . '/?*.php', self::SORT_NONE);
foreach ($subdirFiles as $subdirFile) {
$subdirFile = basename($subdirFile, '.php');
if ($classNameLowered === strtolower($subdirFile)) {
$pluginFiles[$className] = $file . '/' . $subdirFile . '.php';
break;
}
}
}
if (!isset($pluginFiles[$className])) { if (!file_exists($this->getPluginsDir() . $pluginFile)) {
throw new RuntimeException( throw new RuntimeException(
"Unable to load plugin '" . $className . "' from " "Unable to load plugin '" . $className . "' from '" . $pluginFile . "': File not found"
. "'" . $file . "/" . $className . ".php': File not found"
); );
} }
} elseif (substr($file, -4) === '.php') { } elseif (substr($file, -4) === '.php') {
$className = preg_replace('/^[0-9]+-/', '', substr($file, 0, -4)); $className = preg_replace('/^[0-9]+-/', '', substr($file, 0, -4));
$classNameLowered = strtolower($className); $pluginFile = $file;
if (isset($pluginsLowered[$classNameLowered])) {
continue;
}
$pluginFiles[$className] = $file;
} else { } else {
throw new RuntimeException("Unable to load plugin from '" . $file . "': Not a valid plugin file"); throw new RuntimeException("Unable to load plugin from '" . $file . "': Not a valid plugin file");
} }
}
// scope isolated require() if (isset($this->plugins[$className])) {
$includeClosure = function ($pluginFile) { continue;
require($pluginFile); }
};
if (PHP_VERSION_ID >= 50400) {
$includeClosure = $includeClosure->bindTo(null);
}
foreach ($pluginFiles as $className => $pluginFile) {
$includeClosure($this->getPluginsDir() . $pluginFile); $includeClosure($this->getPluginsDir() . $pluginFile);
if (class_exists($className, false)) { if (class_exists($className, false)) {
@ -614,7 +591,9 @@ class Pico
} }
} }
} else { } else {
throw new RuntimeException("Unable to load plugin '" . $className . "' from '" . $pluginFile . "'"); throw new RuntimeException(
"Unable to load plugin '" . $className . "' from '" . $pluginFile . "': Plugin class not found"
);
} }
} }
} }

Loading…
Cancel
Save