franz-deleon/fdl-construct-invoker

A ZF2 module that enables argument passing to class constructors with arguments at construction time.

1.0 2013-09-29 06:16 UTC

This package is not auto-updated.

Last update: 2024-04-22 14:23:09 UTC


README

A ZF2 module that enables argument passing to class constructors (__construct()) that requires or not require arguments at construction time.

Quick glimpse:

// syntax
$this->getServiceLocator()->get('MyInvokableClass')->construct([$firstArg [, $secondArg [, $...]]]);

INSTALLATION:

Register FdlConstructInvoker module in application.config.php. It is important to note that you need to have the module loaded first BEFORE other modules who uses it!

    return array(
      'modules' => array(
          'FdlConstructInvoker', // <<---- Needs to be ontop of Application module
          'Application', // I use FdlConstructInvoker so i need to be bellow it!
          ),
      'module_listener_options' => array(
          'module_paths' => array(
              './module',
              './vendor'
          ),
          'config_glob_paths' => array('config/autoload/{,*.}{global,local}.php')
      )
    );

USAGE:

An example class that you want to register to the service manager.
Notice the class requires a $brick instance in its constructor.

    namespace class\namespace;
    class Brick
    {
        protected $brick;
        
        public function __construct($brick)
        {
            $this->brick = $brick;
        }
        
        public function getBrick()
        {
            return $this->brick;
        }
        
        public function setBrick($briok)
        {
            $this->brick = $brick;
        }
    }

Register your invokable classes in your modules using the provided getConstructInvokerConfig() method.

    // Module.php of Application module
    public function getConstructInvokerConfig()
    {
        return array(
            'invokables' => array(
                'brick' => 'class\namespace\Brick',
            ),
        );
    }

Now you can access the class anywhere you have the main ServiceManager. For example, inside a controller.
Take note of the get('brick')->construct() method whick accepts arguments for the constructor.

    // from an action controller
    public function SomeAction()
    {
        // access it directly from the ServiceManager
        $brick = $this->getServiceLocator()->get('brick')->construct('Concrete Brick');
        echo $brick->getBrick();
        // returns "Concrete Brick"
        
        // you can also access through the Construct Invoker plugin manager
        $brick2 = $this->getServiceLocator()
                       ->get('constructInvokerPlugin')
                       ->get('brick')
                       ->construct('Hollow Blocks');
        echo $brick2->getBrick();
        // creates new instance of brick object and returns "Hollow Blocks"
        
        // same instance of brick
        echo $brick->getBrick(); // returns "Concrete Brick"
        $brick->setBrick('Marbles');
        echo $brick->getBrick() // returns "Marbles"
    }

It will also work for regular invokable classes that are not using constructors:

    // pretend SomeClass is registered using getConstructInvokerConfig()
    echo $this->getServiceConfig->get('SomeClass')->someMethod(); // whatever somemethod does...

UNDER THE HOOD

FdlConstructInvoker module uses the Peering Service Manager functionality of the Service Manager. Modules who disable this may not be able to do directy below:

$this->getServiceLocator()->get('someclass')->construct()

If this is the case. Use the Construct Invoker Plugin Manager:

$this->getServiceLocator()->get('constructInvokerPlugin')->get('someclass')->construct();