From d72b99c5b27d4b34fe1a017702e517db4e209b00 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 16 Jan 2020 14:48:16 +0200 Subject: [PATCH] Added `PluginsLoadedEvent` which triggers after plugins have been loaded but not yet initialized --- CHANGELOG.md | 3 +- .../Common/Processors/InitializeProcessor.php | 43 ++++++++++++++++--- .../Common/Processors/PluginsProcessor.php | 11 ++--- system/src/Grav/Events/PluginsLoadedEvent.php | 34 +++++++++++++++ 4 files changed, 80 insertions(+), 11 deletions(-) create mode 100644 system/src/Grav/Events/PluginsLoadedEvent.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 33336e1be..2636ba949 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,9 @@ 1. [](#new) * _POTENTIAL BREAKING CHANGE:_ Upgraded Parsedown to 1.7 for Parsedown-Extra 0.8. Plugins that extend Parsedown may need a fix to render as HTML - * Added `RegisterPermissionsEvent` which triggers when `$grav['permissions']` is being accessed the first time + * Added `PluginsLoadedEvent` which triggers after plugins have been loaded but not yet initialized * Added `SessionStartEvent` which triggers when session is started + * Added `RegisterPermissionsEvent` which triggers when `$grav['permissions']` is being accessed the first time 1. [](#improved) * Blueprint validation: Added `validate: value_type: bool|int|float|string|trim` to `array` to filter all the values inside the array 1. [](#bugfix) diff --git a/system/src/Grav/Common/Processors/InitializeProcessor.php b/system/src/Grav/Common/Processors/InitializeProcessor.php index 83aa8d934..5ff800de6 100644 --- a/system/src/Grav/Common/Processors/InitializeProcessor.php +++ b/system/src/Grav/Common/Processors/InitializeProcessor.php @@ -12,8 +12,10 @@ namespace Grav\Common\Processors; use Grav\Common\Config\Config; use Grav\Common\Debugger; use Grav\Common\Page\Pages; +use Grav\Common\Plugins; use Grav\Common\Uri; use Grav\Common\Utils; +use Grav\Events\PluginsLoadedEvent; use Grav\Framework\Psr7\Response; use Grav\Framework\Session\Exceptions\SessionException; use Monolog\Formatter\LineFormatter; @@ -61,11 +63,14 @@ class InitializeProcessor extends ProcessorBase $this->stopTimer('_debugger'); $this->initialize($config); + + $this->loadPlugins(); + $this->initializeSession($config); // Wrap call to next handler so that debugger can profile it. /** @var Response $response */ - $response = $debugger->profile(function () use ($handler, $request) { + $response = $debugger->profile(static function () use ($handler, $request) { return $handler->handle($request); }); @@ -89,6 +94,9 @@ class InitializeProcessor extends ProcessorBase return $config; } + /** + * @param Config $config + */ protected function initializeLogger(Config $config): void { $this->startTimer('_logger', 'Logger'); @@ -123,10 +131,15 @@ class InitializeProcessor extends ProcessorBase $this->stopTimer('_errors'); } + /** + * @param Config $config + */ protected function initialize(Config $config): void { $this->startTimer('_init', 'Initialize'); + $grav = $this->container; + // Use output buffering to prevent headers from being sent too early. ob_start(); if ($config->get('system.cache.gzip') && !@ob_start('ob_gzhandler')) { @@ -141,11 +154,11 @@ class InitializeProcessor extends ProcessorBase } /** @var Pages $pages */ - $pages = $this->container['pages']; + $pages = $grav['pages']; $pages->register(); /** @var Uri $uri */ - $uri = $this->container['uri']; + $uri = $grav['uri']; $uri->init(); // Redirect pages with trailing slash if configured to do so. @@ -154,14 +167,34 @@ class InitializeProcessor extends ProcessorBase && $config->get('system.pages.redirect_trailing_slash', false) && Utils::endsWith($path, '/')) { $redirect = (string) $uri::getCurrentRoute()->toString(); - $this->container->redirect($redirect); + $grav->redirect($redirect); } - $this->container->setLocale(); + $grav->setLocale(); $this->stopTimer('_init'); } + protected function loadPlugins(): void + { + $this->startTimer('_plugins_load', 'Load Plugins'); + + $grav = $this->container; + + /** @var Plugins $plugins */ + $plugins = $grav['plugins']; + $plugins->init(); + + // Plugins Loaded Event + $event = new PluginsLoadedEvent($grav, $plugins); + $grav->dispatchEvent($event); + + $this->stopTimer('_plugins_load'); + } + + /** + * @param Config $config + */ protected function initializeSession(Config $config): void { // FIXME: Initialize session should happen later after plugins have been loaded. This is a workaround to fix session issues in AWS. diff --git a/system/src/Grav/Common/Processors/PluginsProcessor.php b/system/src/Grav/Common/Processors/PluginsProcessor.php index 819eb424e..e091217f2 100644 --- a/system/src/Grav/Common/Processors/PluginsProcessor.php +++ b/system/src/Grav/Common/Processors/PluginsProcessor.php @@ -18,15 +18,16 @@ class PluginsProcessor extends ProcessorBase /** @var string */ public $id = 'plugins'; /** @var string */ - public $title = 'Plugins'; + public $title = 'Initialize Plugins'; public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $this->startTimer(); - $this->container['accounts']; - $this->container['pages']; - $this->container['plugins']->init(); - $this->container->fireEvent('onPluginsInitialized'); + $grav = $this->container; + + $grav['accounts']; + + $grav->fireEvent('onPluginsInitialized'); $this->stopTimer(); return $handler->handle($request); diff --git a/system/src/Grav/Events/PluginsLoadedEvent.php b/system/src/Grav/Events/PluginsLoadedEvent.php new file mode 100644 index 000000000..2e7c0421d --- /dev/null +++ b/system/src/Grav/Events/PluginsLoadedEvent.php @@ -0,0 +1,34 @@ +grav = $grav; + $this->plugins = $plugins; + } + + public function __debugInfo(): array + { + return [ + 'plugins' => $this->plugins + ]; + } +}