pictcode / lib / Cake / Core / CakePlugin.php @ efd6f84c
履歴 | 表示 | アノテート | ダウンロード (8.521 KB)
| 1 | 635eef61 | spyder1211 | <?php
|
|---|---|---|---|
| 2 | /**
|
||
| 3 | * CakePlugin class
|
||
| 4 | *
|
||
| 5 | * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
|
||
| 6 | * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||
| 7 | *
|
||
| 8 | * Licensed under The MIT License
|
||
| 9 | * For full copyright and license information, please see the LICENSE.txt
|
||
| 10 | * Redistributions of files must retain the above copyright notice.
|
||
| 11 | *
|
||
| 12 | * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||
| 13 | * @link http://cakephp.org CakePHP(tm) Project
|
||
| 14 | * @package Cake.Core
|
||
| 15 | * @since CakePHP(tm) v 2.0.0
|
||
| 16 | * @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||
| 17 | */
|
||
| 18 | |||
| 19 | /**
|
||
| 20 | * CakePlugin is responsible for loading and unloading plugins. It also can
|
||
| 21 | * retrieve plugin paths and load their bootstrap and routes files.
|
||
| 22 | *
|
||
| 23 | * @package Cake.Core
|
||
| 24 | * @link http://book.cakephp.org/2.0/en/plugins.html
|
||
| 25 | */
|
||
| 26 | class CakePlugin { |
||
| 27 | |||
| 28 | /**
|
||
| 29 | * Holds a list of all loaded plugins and their configuration
|
||
| 30 | *
|
||
| 31 | * @var array
|
||
| 32 | */
|
||
| 33 | protected static $_plugins = array(); |
||
| 34 | |||
| 35 | /**
|
||
| 36 | * Loads a plugin and optionally loads bootstrapping, routing files or loads an initialization function
|
||
| 37 | *
|
||
| 38 | * Examples:
|
||
| 39 | *
|
||
| 40 | * `CakePlugin::load('DebugKit')`
|
||
| 41 | *
|
||
| 42 | * Will load the DebugKit plugin and will not load any bootstrap nor route files
|
||
| 43 | *
|
||
| 44 | * `CakePlugin::load('DebugKit', array('bootstrap' => true, 'routes' => true))`
|
||
| 45 | *
|
||
| 46 | * will load the bootstrap.php and routes.php files
|
||
| 47 | *
|
||
| 48 | * `CakePlugin::load('DebugKit', array('bootstrap' => false, 'routes' => true))`
|
||
| 49 | *
|
||
| 50 | * will load routes.php file but not bootstrap.php
|
||
| 51 | *
|
||
| 52 | * `CakePlugin::load('DebugKit', array('bootstrap' => array('config1', 'config2')))`
|
||
| 53 | *
|
||
| 54 | * will load config1.php and config2.php files
|
||
| 55 | *
|
||
| 56 | * `CakePlugin::load('DebugKit', array('bootstrap' => 'aCallableMethod'))`
|
||
| 57 | *
|
||
| 58 | * will run the aCallableMethod function to initialize it
|
||
| 59 | *
|
||
| 60 | * Bootstrap initialization functions can be expressed as a PHP callback type,
|
||
| 61 | * including closures. Callbacks will receive two parameters
|
||
| 62 | * (plugin name, plugin configuration)
|
||
| 63 | *
|
||
| 64 | * It is also possible to load multiple plugins at once. Examples:
|
||
| 65 | *
|
||
| 66 | * `CakePlugin::load(array('DebugKit', 'ApiGenerator'))`
|
||
| 67 | *
|
||
| 68 | * will load the DebugKit and ApiGenerator plugins
|
||
| 69 | *
|
||
| 70 | * `CakePlugin::load(array('DebugKit', 'ApiGenerator'), array('bootstrap' => true))`
|
||
| 71 | *
|
||
| 72 | * will load bootstrap file for both plugins
|
||
| 73 | *
|
||
| 74 | * ```
|
||
| 75 | * CakePlugin::load(array(
|
||
| 76 | * 'DebugKit' => array('routes' => true),
|
||
| 77 | * 'ApiGenerator'
|
||
| 78 | * ), array('bootstrap' => true))
|
||
| 79 | * ```
|
||
| 80 | *
|
||
| 81 | * Will only load the bootstrap for ApiGenerator and only the routes for DebugKit.
|
||
| 82 | * By using the `path` option you can specify an absolute path to the plugin. Make
|
||
| 83 | * sure that the path is slash terminated or your plugin will not be located properly.
|
||
| 84 | *
|
||
| 85 | * @param string|array $plugin name of the plugin to be loaded in CamelCase format or array or plugins to load
|
||
| 86 | * @param array $config configuration options for the plugin
|
||
| 87 | * @throws MissingPluginException if the folder for the plugin to be loaded is not found
|
||
| 88 | * @return void
|
||
| 89 | */
|
||
| 90 | public static function load($plugin, $config = array()) { |
||
| 91 | if (is_array($plugin)) { |
||
| 92 | foreach ($plugin as $name => $conf) { |
||
| 93 | list($name, $conf) = (is_numeric($name)) ? array($conf, $config) : array($name, $conf); |
||
| 94 | static::load($name, $conf); |
||
| 95 | } |
||
| 96 | return;
|
||
| 97 | } |
||
| 98 | $config += array('bootstrap' => false, 'routes' => false, 'ignoreMissing' => false); |
||
| 99 | if (empty($config['path'])) { |
||
| 100 | foreach (App::path('plugins') as $path) { |
||
| 101 | if (is_dir($path . $plugin)) { |
||
| 102 | static::$_plugins[$plugin] = $config + array('path' => $path . $plugin . DS); |
||
| 103 | break;
|
||
| 104 | } |
||
| 105 | |||
| 106 | //Backwards compatibility to make easier to migrate to 2.0
|
||
| 107 | $underscored = Inflector::underscore($plugin); |
||
| 108 | if (is_dir($path . $underscored)) { |
||
| 109 | static::$_plugins[$plugin] = $config + array('path' => $path . $underscored . DS); |
||
| 110 | break;
|
||
| 111 | } |
||
| 112 | } |
||
| 113 | } else {
|
||
| 114 | static::$_plugins[$plugin] = $config; |
||
| 115 | } |
||
| 116 | |||
| 117 | if (empty(static::$_plugins[$plugin]['path'])) { |
||
| 118 | throw new MissingPluginException(array('plugin' => $plugin)); |
||
| 119 | } |
||
| 120 | if (!empty(static::$_plugins[$plugin]['bootstrap'])) { |
||
| 121 | static::bootstrap($plugin); |
||
| 122 | } |
||
| 123 | } |
||
| 124 | |||
| 125 | /**
|
||
| 126 | * Will load all the plugins located in the configured plugins folders
|
||
| 127 | * If passed an options array, it will be used as a common default for all plugins to be loaded
|
||
| 128 | * It is possible to set specific defaults for each plugins in the options array. Examples:
|
||
| 129 | *
|
||
| 130 | * ```
|
||
| 131 | * CakePlugin::loadAll(array(
|
||
| 132 | * array('bootstrap' => true),
|
||
| 133 | * 'DebugKit' => array('routes' => true, 'bootstrap' => false),
|
||
| 134 | * ))
|
||
| 135 | * ```
|
||
| 136 | *
|
||
| 137 | * The above example will load the bootstrap file for all plugins, but for DebugKit it will only load
|
||
| 138 | * the routes file and will not look for any bootstrap script. If you are loading
|
||
| 139 | * many plugins that inconsistently support routes/bootstrap files, instead of detailing
|
||
| 140 | * each plugin you can use the `ignoreMissing` option:
|
||
| 141 | *
|
||
| 142 | * ```
|
||
| 143 | * CakePlugin::loadAll(array(
|
||
| 144 | * 'ignoreMissing' => true,
|
||
| 145 | * 'bootstrap' => true,
|
||
| 146 | * 'routes' => true,
|
||
| 147 | * ));
|
||
| 148 | * ```
|
||
| 149 | *
|
||
| 150 | * The ignoreMissing option will do additional file_exists() calls but is simpler
|
||
| 151 | * to use.
|
||
| 152 | *
|
||
| 153 | * @param array $options Options list. See CakePlugin::load() for valid options.
|
||
| 154 | * @return void
|
||
| 155 | */
|
||
| 156 | public static function loadAll($options = array()) { |
||
| 157 | $plugins = App::objects('plugins'); |
||
| 158 | foreach ($plugins as $p) { |
||
| 159 | $opts = isset($options[$p]) ? (array)$options[$p] : array(); |
||
| 160 | if (isset($options[0])) { |
||
| 161 | $opts += $options[0]; |
||
| 162 | } |
||
| 163 | static::load($p, $opts); |
||
| 164 | } |
||
| 165 | } |
||
| 166 | |||
| 167 | /**
|
||
| 168 | * Returns the filesystem path for a plugin
|
||
| 169 | *
|
||
| 170 | * @param string $plugin name of the plugin in CamelCase format
|
||
| 171 | * @return string path to the plugin folder
|
||
| 172 | * @throws MissingPluginException if the folder for plugin was not found or plugin has not been loaded
|
||
| 173 | */
|
||
| 174 | public static function path($plugin) { |
||
| 175 | if (empty(static::$_plugins[$plugin])) { |
||
| 176 | throw new MissingPluginException(array('plugin' => $plugin)); |
||
| 177 | } |
||
| 178 | return static::$_plugins[$plugin]['path']; |
||
| 179 | } |
||
| 180 | |||
| 181 | /**
|
||
| 182 | * Loads the bootstrapping files for a plugin, or calls the initialization setup in the configuration
|
||
| 183 | *
|
||
| 184 | * @param string $plugin name of the plugin
|
||
| 185 | * @return mixed
|
||
| 186 | * @see CakePlugin::load() for examples of bootstrap configuration
|
||
| 187 | */
|
||
| 188 | public static function bootstrap($plugin) { |
||
| 189 | $config = static::$_plugins[$plugin]; |
||
| 190 | if ($config['bootstrap'] === false) { |
||
| 191 | return false; |
||
| 192 | } |
||
| 193 | if (is_callable($config['bootstrap'])) { |
||
| 194 | return call_user_func_array($config['bootstrap'], array($plugin, $config)); |
||
| 195 | } |
||
| 196 | |||
| 197 | $path = static::path($plugin); |
||
| 198 | if ($config['bootstrap'] === true) { |
||
| 199 | return static::_includeFile( |
||
| 200 | $path . 'Config' . DS . 'bootstrap.php', |
||
| 201 | $config['ignoreMissing'] |
||
| 202 | ); |
||
| 203 | } |
||
| 204 | |||
| 205 | $bootstrap = (array)$config['bootstrap']; |
||
| 206 | foreach ($bootstrap as $file) { |
||
| 207 | static::_includeFile(
|
||
| 208 | $path . 'Config' . DS . $file . '.php', |
||
| 209 | $config['ignoreMissing'] |
||
| 210 | ); |
||
| 211 | } |
||
| 212 | |||
| 213 | return true; |
||
| 214 | } |
||
| 215 | |||
| 216 | /**
|
||
| 217 | * Loads the routes file for a plugin, or all plugins configured to load their respective routes file
|
||
| 218 | *
|
||
| 219 | * @param string $plugin name of the plugin, if null will operate on all plugins having enabled the
|
||
| 220 | * loading of routes files
|
||
| 221 | * @return bool
|
||
| 222 | */
|
||
| 223 | public static function routes($plugin = null) { |
||
| 224 | if ($plugin === null) { |
||
| 225 | foreach (static::loaded() as $p) { |
||
| 226 | static::routes($p); |
||
| 227 | } |
||
| 228 | return true; |
||
| 229 | } |
||
| 230 | $config = static::$_plugins[$plugin]; |
||
| 231 | if ($config['routes'] === false) { |
||
| 232 | return false; |
||
| 233 | } |
||
| 234 | return (bool)static::_includeFile( |
||
| 235 | static::path($plugin) . 'Config' . DS . 'routes.php', |
||
| 236 | $config['ignoreMissing'] |
||
| 237 | ); |
||
| 238 | } |
||
| 239 | |||
| 240 | /**
|
||
| 241 | * Returns true if the plugin $plugin is already loaded
|
||
| 242 | * If plugin is null, it will return a list of all loaded plugins
|
||
| 243 | *
|
||
| 244 | * @param string $plugin Plugin name to check.
|
||
| 245 | * @return mixed boolean true if $plugin is already loaded.
|
||
| 246 | * If $plugin is null, returns a list of plugins that have been loaded
|
||
| 247 | */
|
||
| 248 | public static function loaded($plugin = null) { |
||
| 249 | if ($plugin) { |
||
| 250 | return isset(static::$_plugins[$plugin]); |
||
| 251 | } |
||
| 252 | $return = array_keys(static::$_plugins); |
||
| 253 | sort($return); |
||
| 254 | return $return; |
||
| 255 | } |
||
| 256 | |||
| 257 | /**
|
||
| 258 | * Forgets a loaded plugin or all of them if first parameter is null
|
||
| 259 | *
|
||
| 260 | * @param string $plugin name of the plugin to forget
|
||
| 261 | * @return void
|
||
| 262 | */
|
||
| 263 | public static function unload($plugin = null) { |
||
| 264 | if ($plugin === null) { |
||
| 265 | static::$_plugins = array(); |
||
| 266 | } else {
|
||
| 267 | unset(static::$_plugins[$plugin]); |
||
| 268 | } |
||
| 269 | } |
||
| 270 | |||
| 271 | /**
|
||
| 272 | * Include file, ignoring include error if needed if file is missing
|
||
| 273 | *
|
||
| 274 | * @param string $file File to include
|
||
| 275 | * @param bool $ignoreMissing Whether to ignore include error for missing files
|
||
| 276 | * @return mixed
|
||
| 277 | */
|
||
| 278 | protected static function _includeFile($file, $ignoreMissing = false) { |
||
| 279 | if ($ignoreMissing && !is_file($file)) { |
||
| 280 | return false; |
||
| 281 | } |
||
| 282 | return include $file; |
||
| 283 | } |
||
| 284 | |||
| 285 | } |