BEAR DI
Dependency Injection
Dependency Injection with PHP5.3 (Symfony 2.0)
User
class Session_Storage
{
   function __construct($cookieName = 'PHP_SESS_ID')
   {
     session_name($cookieName);
     session_start();
   }

    function set($key, $value) {
       $_SESSION[$key] = $value;
    }
// ...
class User
{
   protected $storage;

    function __construct()
    {
       $this->storage = new Session_Storage();

    function setLanguage($language)
    {
        $this->storage->set('language', $language);
    }
    // ...
}

$user = new User();
class User
{
   protected $storage;

    function __construct()
    {
      $this->storage = new Session_Storage();

    function setLanguage($role)
    {
        $this->storage->set('role', $role);
    }
    // ...
}

$user = new User();
class User
{
   protected $storage;

    function __construct($storage)
    {
      $this->storage = $storage;
    }
}




$storage = new Session_Storage();
$user = new User($storage);
class User
{
   protected $storage;

    function __construct($storage)
    {
      $this->storage = $storage;
    }
}




$storage = new Session_Storage();
$user = new User($storage);
class User
{
   protected $storage;

    function __construct($storage)
    {
      $this->storage = $storage;
    }
}




$storage = new Session_Storage();
$user = new User($storage);
=
    Dependency Injection

      Nothing more !
class Session_Storage
{
   function __construct($cookieName = 'PHP_SESS_ID')
   {
     session_name($cookieName);
     session_start();
   }

    function set($key, $value) {
       $_SESSION[$key] = $value;
    }
// ...
class User
{
   protected $storage;

                                              User
    function __construct()
    {
      $this->storage = new Session_Storage(ʻSESSION_IDʼ);

    function setRole($role)
    {
        $this->storage->set('role', $role);
    }
    // ...
}

$user = new User();
class User
{
   protected $storage;

    function __construct()
    {
      $this->storage = new Session_Storage(SESSION_NAME);

    function setRole($role)
    {
        $this->storage->set('role', $role);
    }
    // ...
}

define(ʻSESSION_NAMEʼ , ʻSESSION_IDʼ);
$user = new User();
class User
{
   protected $storage;

    function __construct($sessionName)
    {
      $this->storage = new Session_Storage($sessionName);

    function setRole($role)
    {
        $this->storage->set('role', $role);
    }
    // ...
}
                                              User


$user = new User(ʻSESSION_IDʼ);
class User
{
   protected $storage;

    function __construct(array $sessionOptions)
    {
      $this->storage =
       new Session_Storage($sessionOptions[ʻsess_nameʼ]);

    function setRole($role)
    {
        $this->storage->set('role', $role);
    }
    // ...
}                                                 array
                                        User


$user = new User(array(ʻsession_nameʻ=>USER_SESSʼ));
Session_Storage

            MySQL, Memcached, etc....
Global Registry
class User
{
   protected $storage;
                                 Glob al Registry
    function __construct()
    {
      $this->storage = Registry::get(ʻSESSION_STORAGEʼ);
    }
}

$storage = new SessionStorage();
Registry::set(ʻSESSION_STORAGEʼ, $storage);
$user = new User();
User   Registry
User
Storage
   User Storage
class User
{
   protected $storage;

    function __construct($storage)
                                 User   Storage
    {
      $this->storage = $storage;
    }
}

$storage = new Session_Storage(ʻSESSION_IDʼ);
$user = new User($storage);
DI
class User
{
   protected $storage;

    function __construct($storage)
    {
      $this->storage = $storage;
    }
}

$storage = My_Sql_Session_Storage();
$user = new User($storage);
class User
{
   protected $storage;

    function __construct($storage)
    {
      $this->storage = $storage;
    }
}

$storage = Session_Storage(ʻSESSION_IDʼ);
$user = new User($storage);
class User
{
   protected $storage;

    function __construct(Storage_Interface $storage)
    {
      $this->storage = $storage;
    }
}

Interface Storage_Interface
{
    public function set();
    public function get();
}
class Session_Test implements Storage_Interface
{
    public function get()
    {
     // test get
    }

    public function set()
     {
      // test set
     }
}

                                                  /
: User




         /
$storage = new SessionStorage();

// constructor injection
$user = new User($storage);

// setter injection
$user = new User();
$user->setStorage($storage);

// property injection
$user = new User();
$user->storage = $storage;
PHP   DI   (?)
BEAR DI
new   BEAR::dependency
new App_User($name, $type, $age, $session...);



  BEAR::dependency('App_User', $config);
array $config

new User($name, $type, $age, $session...);
BEAR::dependency('App_User', $config);




$config = array('name'=> 'BEAR', 'age'=>10, ...);
$user = BEAR::dependency('App_User', $config);
                                                             g
                                                (array) $confi


 +



$user = BEAR::get('App_User');
BEAR::dependency('App_User', $config);




$config = new App_Admin_User($adminUserConfig);
$user = BEAR::dependency('App_User', $config);

                                                            nfig
                                              (O bject) $co
BEAR::dependency('App_User', $config);




$user = new App_Admin_User($config);
BEAR::set('user', $user);
$config = 'user';
$user = BEAR::dependency('App_User', $config);

                                                           fig
...                                         (st ring) $con
$user = BEAR::get('user'); //
BEAR::dependency('App_User', $config);




$user = array('App_Admin_User', $config);
BEAR::set('user', $user);
$config = 'user';

$user = BEAR::dependency('App_User', $config);

                                                           g
                                            (arr ay) $confi
BEAR::dependency('App_User', $config);




class App_User
{
    private $_instance;

    function getInstance(array $config)
    {
        if (isset(self::$_instance)){
            return self::$_instance;
        }
        $class = __CLASS__;
        return new $class($config);
    }
}

$user = App_User::getInstance($config);
BEAR::dependency('App_User', $config);




class App_User extends BEAR_Factory
{
    public function factory()
    {
        if (isset($this->_config['is_admin'])) {
            $obj = BEAR::factory('App_Admin_User', $this->_config);
        } else {
            $obj = BEAR::factory('App_User', $this->_config);
        }
        return $obj;
    }
}
BEAR::dependency('App_User', $config);




class App_User extends BEAR_Base
{
    protected $_config;

    function __construct(array $config)
    {
        $this->_config = $config;
    }

    function onInject()
    {
        //
    }
}
(‘injector’ => $injector)
$options = array('injector' => 'onInjectMobile');
$user = BEAR::dependency('App_User', $config, $options);

class User extends BEAR_Base
{
    protected $_config;

    function onInject()
    {
    }

    function onInjectMobile()
    {
    //
    }
}
$options = array('injector' => array ('App_Injector','userInjector'));
$user = BEAR::dependency('App_User', $config, $options);

class App_Injector
{
    public static function userInjector(&$obj)
    {
        $obj->_session = new Session_Storage();
    }
}
=

(‘is_persistent’ => true)
$options = array('is_persistent' => true);
$user = BEAR::dependency('App_User', $config, $options);

class User extends BEAR_Base
{
    function onInject()
    {
        //30
        $this->_map = $this->_convertHugeTable($this->_config['file']);
    }
}
...
function __construct($cookieName, $expire = 3600, $idle = 600)
{
  //...
}
...
function __construct($cookieName, $expire = 3600, $idle = 600)
{
  //...
}
function __construct($cookieName, $expire =
SESSION_EXPIRE_TIME, $idle = SESSION_IDLE_TIME)
{
  //...
}

define('SESSION_EXPIRE_TIME', 3600);
define('SESSION_IDLE_TIME', 600);
function __construct($cookieName, $expire = 3600, $idle = 600)
{
  //...
}



                                                        !!
App.php
$app = BEAR::loadConfig(_BEAR_APP_HOME . '/App/app.yml');
BEAR::init($app);



                                   app.yml
App_Cache:
  expire: 3600
  idle: 600
BEAR_Emoji:
  submit: 'entity'
  emoji_path: '/emoji'
App_Db:
  dsn:
    default: 'mysql://root:@localhost/bear_demo'
    slave:   'mysql://root:@localhost/bear_demo'



$config = array('expire'=> 7200);
$user = BEAR::dependency('App_Cache', $config);
                                                                       fig
                                                   merge (a rray) $con
App.php
$app = BEAR::loadConfig(_BEAR_APP_HOME . “/App/app.{$lan}.yml');
BEAR::init($app);



                           app.ja.yml
Page_Hello_World:
  message: ‘           ’




                           app.en.yml
Page_Hello_World:
  message: ‘Hello World’
Conclusion
DI -
class App_Foo extends BEAR_Base
{
	 public function __construct(array $config)     1.
	 {
	 	 parent::__construct($config);
                                                      __construct()
	 }
	
	 public function onInject()                     2.
	 {                                                    onInject()
	 	 $this->_bar = BEAR::dependency('App_Bar');
	 }
	
	 public function getBar(){                      3.
	 	 return $this->_bar->get();
	 }
}
DI -
     $foo = BEAR::dependency('App_Foo', $config, $options);
     echo $foo->getBar();



•     new                  BEAR::dependency
•                     array $config1

•
•     $config

    (array) $config    (Object) $config   (string) $config
DI -
#                config
core:
  #
    debug: 0
    #
    info:
      id: beardemo
      version: 0.0.2

BEAR_Cache:
  # int                        0   | 1 PEAR::Cache_Lite | 2 MEMCACHE | 3 APC
    adaptor: 1
    # path: dsn | file path | memcache host(s)
    #   - localhost

#
App_Form_Blog_Entry:
  label:
    main: '       '
     title: '          '
     body: '     '
     submit: '             '
    error:
      title_required: '                     '

BEAR DI

  • 1.
  • 2.
    Dependency Injection withPHP5.3 (Symfony 2.0)
  • 3.
  • 5.
    class Session_Storage { function __construct($cookieName = 'PHP_SESS_ID') { session_name($cookieName); session_start(); } function set($key, $value) { $_SESSION[$key] = $value; } // ...
  • 7.
    class User { protected $storage; function __construct() { $this->storage = new Session_Storage(); function setLanguage($language) { $this->storage->set('language', $language); } // ... } $user = new User();
  • 8.
    class User { protected $storage; function __construct() { $this->storage = new Session_Storage(); function setLanguage($role) { $this->storage->set('role', $role); } // ... } $user = new User();
  • 10.
    class User { protected $storage; function __construct($storage) { $this->storage = $storage; } } $storage = new Session_Storage(); $user = new User($storage);
  • 11.
    class User { protected $storage; function __construct($storage) { $this->storage = $storage; } } $storage = new Session_Storage(); $user = new User($storage);
  • 12.
    class User { protected $storage; function __construct($storage) { $this->storage = $storage; } } $storage = new Session_Storage(); $user = new User($storage);
  • 13.
    = Dependency Injection Nothing more !
  • 16.
    class Session_Storage { function __construct($cookieName = 'PHP_SESS_ID') { session_name($cookieName); session_start(); } function set($key, $value) { $_SESSION[$key] = $value; } // ...
  • 17.
    class User { protected $storage; User function __construct() { $this->storage = new Session_Storage(ʻSESSION_IDʼ); function setRole($role) { $this->storage->set('role', $role); } // ... } $user = new User();
  • 18.
    class User { protected $storage; function __construct() { $this->storage = new Session_Storage(SESSION_NAME); function setRole($role) { $this->storage->set('role', $role); } // ... } define(ʻSESSION_NAMEʼ , ʻSESSION_IDʼ); $user = new User();
  • 19.
    class User { protected $storage; function __construct($sessionName) { $this->storage = new Session_Storage($sessionName); function setRole($role) { $this->storage->set('role', $role); } // ... } User $user = new User(ʻSESSION_IDʼ);
  • 20.
    class User { protected $storage; function __construct(array $sessionOptions) { $this->storage = new Session_Storage($sessionOptions[ʻsess_nameʼ]); function setRole($role) { $this->storage->set('role', $role); } // ... } array User $user = new User(array(ʻsession_nameʻ=>USER_SESSʼ));
  • 21.
    Session_Storage MySQL, Memcached, etc....
  • 22.
  • 23.
    class User { protected $storage; Glob al Registry function __construct() { $this->storage = Registry::get(ʻSESSION_STORAGEʼ); } } $storage = new SessionStorage(); Registry::set(ʻSESSION_STORAGEʼ, $storage); $user = new User();
  • 24.
    User Registry
  • 25.
    User Storage User Storage
  • 26.
    class User { protected $storage; function __construct($storage) User Storage { $this->storage = $storage; } } $storage = new Session_Storage(ʻSESSION_IDʼ); $user = new User($storage);
  • 27.
  • 28.
    class User { protected $storage; function __construct($storage) { $this->storage = $storage; } } $storage = My_Sql_Session_Storage(); $user = new User($storage);
  • 29.
    class User { protected $storage; function __construct($storage) { $this->storage = $storage; } } $storage = Session_Storage(ʻSESSION_IDʼ); $user = new User($storage);
  • 30.
    class User { protected $storage; function __construct(Storage_Interface $storage) { $this->storage = $storage; } } Interface Storage_Interface { public function set(); public function get(); }
  • 31.
    class Session_Test implementsStorage_Interface { public function get() { // test get } public function set() { // test set } } /
  • 32.
  • 34.
    $storage = newSessionStorage(); // constructor injection $user = new User($storage); // setter injection $user = new User(); $user->setStorage($storage); // property injection $user = new User(); $user->storage = $storage;
  • 35.
    PHP DI (?)
  • 36.
  • 37.
    new BEAR::dependency
  • 38.
    new App_User($name, $type,$age, $session...); BEAR::dependency('App_User', $config);
  • 39.
    array $config new User($name,$type, $age, $session...);
  • 40.
    BEAR::dependency('App_User', $config); $config =array('name'=> 'BEAR', 'age'=>10, ...); $user = BEAR::dependency('App_User', $config); g (array) $confi + $user = BEAR::get('App_User');
  • 41.
    BEAR::dependency('App_User', $config); $config =new App_Admin_User($adminUserConfig); $user = BEAR::dependency('App_User', $config); nfig (O bject) $co
  • 42.
    BEAR::dependency('App_User', $config); $user =new App_Admin_User($config); BEAR::set('user', $user); $config = 'user'; $user = BEAR::dependency('App_User', $config); fig ... (st ring) $con $user = BEAR::get('user'); //
  • 43.
    BEAR::dependency('App_User', $config); $user =array('App_Admin_User', $config); BEAR::set('user', $user); $config = 'user'; $user = BEAR::dependency('App_User', $config); g (arr ay) $confi
  • 44.
    BEAR::dependency('App_User', $config); class App_User { private $_instance; function getInstance(array $config) { if (isset(self::$_instance)){ return self::$_instance; } $class = __CLASS__; return new $class($config); } } $user = App_User::getInstance($config);
  • 45.
    BEAR::dependency('App_User', $config); class App_Userextends BEAR_Factory { public function factory() { if (isset($this->_config['is_admin'])) { $obj = BEAR::factory('App_Admin_User', $this->_config); } else { $obj = BEAR::factory('App_User', $this->_config); } return $obj; } }
  • 46.
    BEAR::dependency('App_User', $config); class App_Userextends BEAR_Base { protected $_config; function __construct(array $config) { $this->_config = $config; } function onInject() { // } }
  • 48.
  • 49.
    $options = array('injector'=> 'onInjectMobile'); $user = BEAR::dependency('App_User', $config, $options); class User extends BEAR_Base { protected $_config; function onInject() { } function onInjectMobile() { // } }
  • 50.
    $options = array('injector'=> array ('App_Injector','userInjector')); $user = BEAR::dependency('App_User', $config, $options); class App_Injector { public static function userInjector(&$obj) { $obj->_session = new Session_Storage(); } }
  • 51.
  • 52.
    $options = array('is_persistent'=> true); $user = BEAR::dependency('App_User', $config, $options); class User extends BEAR_Base { function onInject() { //30 $this->_map = $this->_convertHugeTable($this->_config['file']); } }
  • 54.
    ... function __construct($cookieName, $expire= 3600, $idle = 600) { //... }
  • 55.
    ... function __construct($cookieName, $expire= 3600, $idle = 600) { //... }
  • 56.
    function __construct($cookieName, $expire= SESSION_EXPIRE_TIME, $idle = SESSION_IDLE_TIME) { //... } define('SESSION_EXPIRE_TIME', 3600); define('SESSION_IDLE_TIME', 600);
  • 57.
    function __construct($cookieName, $expire= 3600, $idle = 600) { //... } !!
  • 59.
    App.php $app = BEAR::loadConfig(_BEAR_APP_HOME. '/App/app.yml'); BEAR::init($app); app.yml App_Cache: expire: 3600 idle: 600 BEAR_Emoji: submit: 'entity' emoji_path: '/emoji' App_Db: dsn: default: 'mysql://root:@localhost/bear_demo' slave: 'mysql://root:@localhost/bear_demo' $config = array('expire'=> 7200); $user = BEAR::dependency('App_Cache', $config); fig merge (a rray) $con
  • 60.
    App.php $app = BEAR::loadConfig(_BEAR_APP_HOME. “/App/app.{$lan}.yml'); BEAR::init($app); app.ja.yml Page_Hello_World: message: ‘ ’ app.en.yml Page_Hello_World: message: ‘Hello World’
  • 61.
  • 62.
    DI - class App_Fooextends BEAR_Base { public function __construct(array $config) 1. { parent::__construct($config); __construct() } public function onInject() 2. { onInject() $this->_bar = BEAR::dependency('App_Bar'); } public function getBar(){ 3. return $this->_bar->get(); } }
  • 63.
    DI - $foo = BEAR::dependency('App_Foo', $config, $options); echo $foo->getBar(); • new BEAR::dependency • array $config1 • • $config (array) $config (Object) $config (string) $config
  • 64.
    DI - # config core: # debug: 0 # info: id: beardemo version: 0.0.2 BEAR_Cache: # int 0 | 1 PEAR::Cache_Lite | 2 MEMCACHE | 3 APC adaptor: 1 # path: dsn | file path | memcache host(s) # - localhost # App_Form_Blog_Entry: label: main: ' ' title: ' ' body: ' ' submit: ' ' error: title_required: ' '