dxw/iguana

Dependency injection framework for WordPress

v1.3.2 2023-08-10 08:51 UTC

README

An extensible theme and plugin framework for WordPress.

Components

  • iguana is the library that allows themes and plugins to set up autoloading and dependency injection without nearly as much boilerplate code
  • iguana-theme builds on iguana and allows themes to register helper functions and use template layouts

Theme templates that use Iguana

Installation

Add the iguana library to your theme or plugin:

$ composer require dxw/iguana

Add these two lines to templates/functions.php (modify appropriately if functions.php isn't in a subdirectory):

$registrar = require __DIR__.'/../app/load.php';
$registrar->register();

Add a new file called app/load.php:

<?php

require __DIR__.'/../vendor.phar';

return \Dxw\Iguana\Init::init(__DIR__, 'MyTheme');

(Replace MyTheme with the namespace of your own theme/plugin.)

Add a new file called app/di.php:

It can start out blank:

<?php

But eventually it will contain the code necessary to construct the dependency graph of your code, i.e.:

$registrar->addInstance(new \MyTheme\MyClass());
$registrar->addInstance(new \MyTheme\MyOtherClass(
    $registrar->getInstance(\MyTheme\MyClass::class)
));

What Iguana provides

For your dependency-injected class structure

Your classes can indicate that they have code that needs running (this is run on the call to $registrar->register() in functions.php):

<?php

namespace MyTheme;

class MyClass implements \Dxw\Iguana\Registerable
{
    public function register()
    {
        add_filter(...);
    }
}

Any instance added to the registrar that implements \Dxw\Iguana\Registerable will have its register() method called.

This means you don't have to remember call the register() method somewhere after adding it to app/di.php.

And moving the calls to add_filter(), 'register_xyz()`, etc out of the constructor makes unit testing easier.

For your background processes and cron jobs

If you're running a background process or cron job outside of WordPress, you can $registrar = require('path/to/load.php'); to load all the code in your theme/plugin. If you need to register it, you can do it piece-by-piece, or you can $registrar->register(); to register it all at once.

Licence

MIT