diff --git a/framework/yii/base/Application.php b/framework/yii/base/Application.php index da2ad6b..07e8428 100644 --- a/framework/yii/base/Application.php +++ b/framework/yii/base/Application.php @@ -144,18 +144,8 @@ abstract class Application extends Module public function __construct($config = []) { Yii::$app = $this; - if (!isset($config['id'])) { - throw new InvalidConfigException('The "id" configuration is required.'); - } - if (isset($config['basePath'])) { - $this->setBasePath($config['basePath']); - unset($config['basePath']); - } else { - throw new InvalidConfigException('The "basePath" configuration is required.'); - } $this->preInit($config); - $this->registerErrorHandlers(); $this->registerCoreComponents(); @@ -165,10 +155,23 @@ abstract class Application extends Module /** * Pre-initializes the application. * This method is called at the beginning of the application constructor. + * It initializes several important application properties. + * If you override this method, please make sure you call the parent implementation. * @param array $config the application configuration + * @throws InvalidConfigException if either [[id]] or [[basePath]] configuration is missing. */ public function preInit(&$config) { + if (!isset($config['id'])) { + throw new InvalidConfigException('The "id" configuration is required.'); + } + if (isset($config['basePath'])) { + $this->setBasePath($config['basePath']); + unset($config['basePath']); + } else { + throw new InvalidConfigException('The "basePath" configuration is required.'); + } + if (isset($config['vendorPath'])) { $this->setVendorPath($config['vendorPath']); unset($config['vendorPath']); @@ -183,6 +186,7 @@ abstract class Application extends Module // set "@runtime" $this->getRuntimePath(); } + if (isset($config['timeZone'])) { $this->setTimeZone($config['timeZone']); unset($config['timeZone']); @@ -192,6 +196,31 @@ abstract class Application extends Module } /** + * @inheritdoc + */ + public function init() + { + parent::init(); + $this->initExtensions($this->extensions); + } + + /** + * Initializes the extensions. + * @param array $extensions the extensions to be initialized. Please refer to [[extensions]] + * for the structure of the extension array. + */ + protected function initExtensions($extensions) + { + foreach ($extensions as $extension) { + if (isset($extension['bootstrap'])) { + /** @var Extension $class */ + $class = $extension['bootstrap']; + $class::init(); + } + } + } + + /** * Loads components that are declared in [[preload]]. * @throws InvalidConfigException if a component or module to be preloaded is unknown */ diff --git a/framework/yii/base/Extension.php b/framework/yii/base/Extension.php index dac9552..c25a043 100644 --- a/framework/yii/base/Extension.php +++ b/framework/yii/base/Extension.php @@ -8,11 +8,21 @@ namespace yii\base; /** + * Extension is the base class that may be extended by individual extensions. + * + * Extension serves as the bootstrap class for extensions. When an extension + * is installed via composer, the [[init()]] method of its Extension class (if any) + * will be invoked during the application initialization stage. + * * @author Qiang Xue * @since 2.0 */ class Extension { + /** + * Initializes the extension. + * This method is invoked at the end of [[Application::init()]]. + */ public static function init() { }