-
Notifications
You must be signed in to change notification settings - Fork 808
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Trying to add deterministic initialization. (#14168)
* Trying to add deterministic initialization. This change tries several new ways to initialize objects by using hooks instead of initalizing manually. * Fixed the order in which init happens, fixed tests. * Fixes standalone sync suite test run and removes redundant init call. * Added a config package to assist with initialization. * Added basic configuration to the config package. * Additional init parameter for the Actions class. * Brought the init call back because we need at least one, props @kbrown9. * Reverted Sync changes related to passing instances. * Rollback and taking a different direction: separate instances where possible, feature requirement instead of configuration. * Added a Jetpack::configure call to the bootstrap, props @kbrown9 for the fix! * Added a README file for the config package. * Update composer.lock after rebasing against master * Refactored the way we initalize classes and added one time init protection. * Added a README part about adding your package to the Config class. * Updated priority number in the README, props @kbrown9 for spotting that! * Fixed the comment. * Fixed the ensure_class method, removed the feature variable that is no longer available. * Added feature ensure constants to make ensure call return values more logical. * Updated the version number in the filter comment. Co-authored-by: Brandon Kraft <public@brandonkraft.com>
- Loading branch information
Showing
16 changed files
with
419 additions
and
69 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
# Jetpack Configuration | ||
|
||
Allows for enabling and initializing of Jetpack features provided by | ||
other packages. | ||
|
||
# Usage | ||
|
||
Add this package as a dependency to your project: | ||
|
||
``` | ||
composer require automattic/jetpack-config | ||
``` | ||
|
||
Add every other package you're planning to configure: | ||
|
||
``` | ||
composer require automattic/jetpack-sync | ||
composer require automattic/jetpack-tracking | ||
composer require automattic/jetpack-terms-of-service | ||
``` | ||
|
||
In your code initialize the configuration package at or before | ||
plugins_loaded priority 1: | ||
|
||
``` | ||
use Automattic/Jetpack/Config; | ||
// Configuring Jetpack as early as plugins_loaded priority 1 | ||
// to make sure every action handler gets properly set. | ||
add_action( 'plugins_loaded', 'configure_jetpack', 1 ); | ||
function configure_jetpack() { | ||
$config = new Config(); | ||
foreach ( | ||
array( | ||
'sync', | ||
'tracking', | ||
'tos', | ||
) | ||
as $feature | ||
) { | ||
$config->ensure( $feature ); | ||
} | ||
} | ||
``` | ||
|
||
# Adding your package to the config class | ||
|
||
You can have your package initialized using the Config class by | ||
adding several things. | ||
|
||
## The configure method | ||
|
||
It's better to have one static configure method in your package | ||
class. That method will be called early on the `plugins_loaded` | ||
hook. This way you can add your own `plugins_loaded` handlers with | ||
standard priority and they will get executed: | ||
|
||
``` | ||
class Configurable_Package { | ||
public static function configure() { | ||
add_action( 'plugins_loaded', array( __CLASS__, 'on_plugins_loaded' ); | ||
} | ||
public static function on_plugins_loaded() { | ||
self::do_interesting_stuff(); | ||
} | ||
} | ||
``` | ||
|
||
## The feature enabling method | ||
|
||
An enabling method should be added to the Config class and should only contain your configuration method call. | ||
|
||
``` | ||
public function enable_configurable_package() { | ||
Configurable_Package::configure(); | ||
return true; | ||
} | ||
``` | ||
|
||
Note that the method name should use the feature slug, in this case | ||
your feature slug is `configurable_package` for the sake of | ||
simplicity. When you're adding your feature it should be unique and | ||
recognizable, like `sync` or `tracking`. | ||
|
||
## The feature slug | ||
|
||
To make sure the feature is supported by the Config class, you need to | ||
add its slug to the config class property: | ||
|
||
``` | ||
/** | ||
* The initial setting values. | ||
* | ||
* @var Array | ||
*/ | ||
protected $config = array( | ||
// ... | ||
'configurable_package' => false, | ||
// ... | ||
); | ||
``` | ||
|
||
## The ensure call | ||
|
||
Finally you need to add a block that will check if your package is | ||
loaded and mark it to be initialized: | ||
|
||
``` | ||
if ( $this->config['configurable_package'] ) { | ||
$this->ensure_class( 'Configurable_Package' ) && $this->ensure_feature( 'configurable_package' ); | ||
} | ||
``` | ||
|
||
This code does three things: it checks whether the current setup has | ||
requested your package to be loaded. Next it checks if the class that | ||
you need for the package to run is present, and then it adds the hook | ||
handlers that initialize your class. After that you can use the config | ||
package's interface in a Jetpack package consumer application and load | ||
your package as shown in the first section of this README. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
{ | ||
"name": "automattic/jetpack-config", | ||
"description": "Jetpack configuration package that initializes other packages and configures Jetpack's functionality. Can be used as a base for all variants of Jetpack package usage.", | ||
"type": "library", | ||
"license": "GPL-2.0-or-later", | ||
"minimum-stability": "dev", | ||
"require": {}, | ||
"autoload": { | ||
"classmap": [ | ||
"src/" | ||
] | ||
} | ||
} |
Oops, something went wrong.