Add an initial set of dependency injection bindings.
authorChuck Hagenbuch <chuck@horde.org>
Thu, 14 Jan 2010 22:22:36 +0000 (17:22 -0500)
committerChuck Hagenbuch <chuck@horde.org>
Thu, 14 Jan 2010 22:22:36 +0000 (17:22 -0500)
These are configured automatically when the Registry is set up, access the
current global $conf array, and let you create:
- a Horde_Db instance, by asking for db-reader, db-writer, or db-manager (the
  distinction isn't implemented yet)
- a null Horde_Log_Logger object (our config is still for PEAR Log)
- a real Horde_Cache object as configured in $conf

framework/Core/lib/Horde/Core/Binder/Cache.php [new file with mode: 0644]
framework/Core/lib/Horde/Core/Binder/Db.php [new file with mode: 0644]
framework/Core/lib/Horde/Core/Binder/Logger.php [new file with mode: 0644]
framework/Core/lib/Horde/Registry.php
framework/Core/package.xml

diff --git a/framework/Core/lib/Horde/Core/Binder/Cache.php b/framework/Core/lib/Horde/Core/Binder/Cache.php
new file mode 100644 (file)
index 0000000..bd56c6c
--- /dev/null
@@ -0,0 +1,32 @@
+<?php
+class Horde_Core_Binder_Cache implements Horde_Injector_Binder
+{
+    public function create(Horde_Injector $injector)
+    {
+        $driver = $GLOBALS['conf']['cache']['driver'];
+        $params = Horde::getDriverConfig('cache', $driver);
+
+        if (is_array($driver)) {
+            list($app, $driver_name) = $driver;
+            $driver = basename($driver_name);
+        } else {
+            $driver = basename($driver);
+        }
+
+        if (empty($driver) || $driver == 'none') {
+            return new Horde_Cache_Null($params);
+        }
+
+        $class = (empty($app) ? 'Horde' : $app) . '_Cache_' . ucfirst($driver);
+        if (class_exists($class)) {
+            return new $class($params);
+        }
+
+        throw new Horde_Exception('Class definition of ' . $class . ' not found.');
+    }
+
+    public function equals(Horde_Injector_Binder $binder)
+    {
+        return false;
+    }
+}
diff --git a/framework/Core/lib/Horde/Core/Binder/Db.php b/framework/Core/lib/Horde/Core/Binder/Db.php
new file mode 100644 (file)
index 0000000..3368057
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+class Horde_Core_Binder_Db implements Horde_Injector_Binder
+{
+    /**
+     * If there are multiple db instances, which one should be returned?
+     * @var string
+     */
+    protected $_kind = 'manager';
+
+    /**
+     * @param string $kind  The kind of database connection to return - reader, writer, manager.
+     */
+    public function __construct($kind = null)
+    {
+        $this->_kind = $kind;
+    }
+
+    /**
+     * Handle Horde-style configuration arrays, PEAR DB/MDB2 arrays or DSNs, or
+     * PDO DSNS.
+     */
+    public function create(Horde_Injector $injector)
+    {
+        $config = $GLOBALS['conf']['sql'];
+        if (!isset($config['adapter'])) {
+            $config['adapter'] = $config['phptype'] == 'mysqli' ? 'mysqli' : 'pdo_' . $config['phptype'];
+        }
+
+        if (!isset($config['logger'])) {
+            $config['logger'] = $injector->getInstance('Horde_Log_Logger');
+        }
+
+        if (!isset($config['cache'])) {
+            $config['cache'] = $injector->getInstance('Horde_Cache');
+        }
+
+        /* @TODO Based on $this->_kind and the splitread configuration, return a
+         * reader, writer, or manager connection. */
+
+        $adapter = str_replace(' ', '_' , ucwords(str_replace('_', ' ', basename($config['adapter']))));
+        $class = 'Horde_Db_Adapter_' . $adapter;
+        if (!class_exists($class)) {
+            throw new Horde_Exception('Adapter class "' . $class . '" not found');
+        }
+
+        return new $class($config);
+    }
+
+    public function equals(Horde_Injector_Binder $binder)
+    {
+        return false;
+    }
+}
diff --git a/framework/Core/lib/Horde/Core/Binder/Logger.php b/framework/Core/lib/Horde/Core/Binder/Logger.php
new file mode 100644 (file)
index 0000000..1e8ec75
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+class Horde_Core_Binder_Logger implements Horde_Injector_Binder
+{
+    public function create(Horde_Injector $injector)
+    {
+        return new Horde_Log_Logger(new Horde_Log_Handler_Null());
+    }
+
+    public function equals(Horde_Injector_Binder $binder)
+    {
+        return false;
+    }
+}
index b56250b..9c114cf 100644 (file)
@@ -196,6 +196,14 @@ class Horde_Registry
             throw new Horde_Exception(_("This system is currently deactivated."));
         }
 
+        /* Set default bindings. */
+        $GLOBALS['injector'] = new Horde_Injector(new Horde_Injector_TopLevel());
+        $GLOBALS['injector']->addBinder('Horde_Cache', new Horde_Core_Binder_Cache());
+        $GLOBALS['injector']->addBinder('Horde_Log_Logger', new Horde_Core_Binder_Logger());
+        $GLOBALS['injector']->addBinder('db-reader', new Horde_Core_Binder_Db('reader'));
+        $GLOBALS['injector']->addBinder('db-writer', new Horde_Core_Binder_Db('writer'));
+        $GLOBALS['injector']->addBinder('db-manager', new Horde_Core_Binder_Db('manager'));
+
         /* Create the global permissions object. */
         // TODO: Remove(?)
         $GLOBALS['perms'] = Horde_Perms::singleton();
index fade2bb..3f47c8a 100644 (file)
@@ -49,6 +49,13 @@ Application Framework.
    <dir name="lib">
     <dir name="Horde">
      <file name="Config.php" role="php" />
+     <dir name="Core">
+      <dir name="Binder">
+       <file name="Cache.php" role="php" />
+       <file name="Db.php" role="php" />
+       <file name="Logger.php" role="php" />
+      </dir> <!-- /lib/Horde/Core/Binder -->
+     </dir> <!-- /lib/Horde/Core -->
      <file name="ErrorHandler.php" role="php" />
      <dir name="Exception">
       <file name="HookNotSet.php" role="php" />
@@ -123,6 +130,9 @@ Application Framework.
  <phprelease>
   <filelist>
    <install name="lib/Horde/Config.php" as="Horde/Config.php" />
+   <install name="lib/Horde/Core/Binder/Cache.php" as="Horde/Core/Binder/Cache.php" />
+   <install name="lib/Horde/Core/Binder/Db.php" as="Horde/Core/Binder/Db.php" />
+   <install name="lib/Horde/Core/Binder/Logger.php" as="Horde/Core/Binder/Logger.php" />
    <install name="lib/Horde/ErrorHandler.php" as="Horde/ErrorHandler.php" />
    <install name="lib/Horde/Exception/HookNotSet.php" as="Horde/Exception/HookNotSet.php" />
    <install name="lib/Horde/Help.php" as="Horde/Help.php" />