twogood / pebble

Dependency Injection system for PHP

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Pebble Dependency Injection for PHP - https://github.com/twogood/pebble


Simple Pebble usage
-------------------

1. require_once 'Pebble.php';

2. annotate properties with /** @Pebble(name) */, where name has a
corresponding @SharedPebble or @PebbleFactory

    /** @Pebble(name) */
    private $property;

3. classes that use @Pebble must either inherit from PebbleDash, or call
PebbleDash::dashObject($this) in their constructor (or similar)

    class Example1 extends PebbleDash 
    { 
    }
    
    class Example2 extends OtherClass
    { 
      public function __construct()
      {
        parent::__construct();
        PebbleDash::dashObject($this);
      }
    }


Simple PebbleCollector usage
-------------------------------------

1. Same as "Simple Pebble Usage" above 

2. require_once 'PebbleCollector.php';

3. annotate classes that will become shared objects (singletons) with 

    /** @SharedPebble(name) */
    class Foo {}

4. annotate classes that always return a new instance with 

    /** @PebbleFactory(name) */
    class Bar {}

5. call PebbleCollector::collectPebbles()



Annotations
-----------

o Annotations are enclosed in /** and */

o Valid class annotations are @SharedPebble and @PebbleFactory (requires PebbleCollector)

o If no pebble name is supplied within parenthesis after the annotation, the
class name is used

o Valid property annotation is @Pebble

o If no pebble name is supplied within parenthesis after the class annotation,
the property name is used

o Constructor arguments are not supported


Usage notes
-----------

o Pebble names are case-insensitive

o Pebble is viral; i.e. Pebble::dash will be called on all objects
that are set by dependency injection, i.e. have an @Pebble annotation.


Using PebbleCollection
----------------------

The PebbleCollection contains all registered pebbles. 

There is not (yet) support in Pebble for loading a PebbleCollection from a file.

The PebbleCollection::set method is used to explicitly pebbles to the
collection. The first parameter is the name of the pebble. The second parameter
is either an anonymous function (closure) that will be evaluated on injection,
or a value that will be injected as-is.


Pebble and class autoloading
----------------------------

When using Pebble with a project that uses PHP's Autoloading of Classes (for
example if you use Zend Framework), the @PebbleFactory and @SharedPebble
annotations are probably not useful. This is because the classes you want to
inject are not yet loaded!

In this case you use the setShared and/or setFactory methods of
PebbleCollection, as documented above.


Example for Zend Framework (1.x)
--------------------------------

In Bootstrap.php:

  class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  {
    protected function _initServices()
    {
      $options = $this->getOptions();
      PebbleCollection::set('webServiceOptions', $options['webService']);
      PebbleCollection::once('webServiceClient', function () { return new Application_Model_WebServiceClient(); } );
      /* ... */
    }


In models/WebServiceClient.php:

  class Application_Model_WebServiceClient
  {
    /** @Pebble(webServiceOptions) */
    private $options;

    /* ... */
}


In models/MyController.php:

class MyController extends Zend_Controller_Action
{
  /** @Pebble */
  private $webServiceClient;

  public function init()
  {
    PebbleDash::dashObject($this);
  }
    
  /* ... */
}




About

Dependency Injection system for PHP


Languages

Language:PHP 100.0%