diff --git a/framework/yii/base/Application.php b/framework/yii/base/Application.php index da2ad6bc9e..07e8428462 100644 --- a/framework/yii/base/Application.php +++ b/framework/yii/base/Application.php @@ -144,6 +144,24 @@ abstract class Application extends Module public function __construct($config = []) { Yii::$app = $this; + + $this->preInit($config); + $this->registerErrorHandlers(); + $this->registerCoreComponents(); + + Component::__construct($config); + } + + /** + * 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.'); } @@ -154,21 +172,6 @@ abstract class Application extends Module throw new InvalidConfigException('The "basePath" configuration is required.'); } - $this->preInit($config); - - $this->registerErrorHandlers(); - $this->registerCoreComponents(); - - Component::__construct($config); - } - - /** - * Pre-initializes the application. - * This method is called at the beginning of the application constructor. - * @param array $config the application configuration - */ - public function preInit(&$config) - { 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']); @@ -191,6 +195,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 dac955227d..c25a0430b8 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() { }