Overview

Namespaces

  • Charcoal
    • App
      • Action
      • Config
      • Handler
      • Middleware
      • Module
      • Route
      • Script
      • ServiceProvider
      • Template

Classes

  • Charcoal\App\Action\AbstractAction
  • Charcoal\App\App
  • Charcoal\App\AppConfig
  • Charcoal\App\AppContainer
  • Charcoal\App\Config\CacheConfig
  • Charcoal\App\Config\DatabaseConfig
  • Charcoal\App\Config\FilesystemConfig
  • Charcoal\App\Config\LoggerConfig
  • Charcoal\App\Config\MemcacheCacheConfig
  • Charcoal\App\Config\MemcacheCacheServerConfig
  • Charcoal\App\Handler\AbstractHandler
  • Charcoal\App\Handler\Error
  • Charcoal\App\Handler\HandlerConfig
  • Charcoal\App\Handler\NotAllowed
  • Charcoal\App\Handler\NotFound
  • Charcoal\App\Handler\PhpError
  • Charcoal\App\Handler\Shutdown
  • Charcoal\App\Middleware\CacheMiddleware
  • Charcoal\App\Module\AbstractModule
  • Charcoal\App\Module\ModuleConfig
  • Charcoal\App\Module\ModuleManager
  • Charcoal\App\Route\ActionRoute
  • Charcoal\App\Route\ActionRouteConfig
  • Charcoal\App\Route\RouteConfig
  • Charcoal\App\Route\RouteManager
  • Charcoal\App\Route\ScriptRoute
  • Charcoal\App\Route\ScriptRouteConfig
  • Charcoal\App\Route\TemplateRoute
  • Charcoal\App\Route\TemplateRouteConfig
  • Charcoal\App\Script\AbstractScript
  • Charcoal\App\ServiceProvider\AppServiceProvider
  • Charcoal\App\ServiceProvider\CacheServiceProvider
  • Charcoal\App\ServiceProvider\DatabaseServiceProvider
  • Charcoal\App\ServiceProvider\FilesystemServiceProvider
  • Charcoal\App\ServiceProvider\LoggerServiceProvider
  • Charcoal\App\ServiceProvider\ViewServiceProvider
  • Charcoal\App\Template\AbstractTemplate
  • Charcoal\App\Template\AbstractWidget
  • Charcoal\App\Template\WidgetBuilder

Interfaces

  • Charcoal\App\Action\ActionInterface
  • Charcoal\App\AppAwareInterface
  • Charcoal\App\Handler\HandlerInterface
  • Charcoal\App\Module\ModuleInterface
  • Charcoal\App\Route\RouteInterface
  • Charcoal\App\Script\CronScriptInterface
  • Charcoal\App\Script\ScriptInterface
  • Charcoal\App\Template\TemplateInterface
  • Charcoal\App\Template\WidgetInterface

Traits

  • Charcoal\App\AppAwareTrait
  • Charcoal\App\CallableResolverAwareTrait
  • Charcoal\App\Script\ArgScriptTrait
  • Charcoal\App\Script\CronScriptTrait
  • Charcoal\App\Script\PathScriptTrait
  • Overview
  • Namespace
  • Class
  1: <?php
  2: 
  3: namespace Charcoal\App\ServiceProvider;
  4: 
  5: // PHP dependencies
  6: use Exception;
  7: use PDO;
  8: 
  9: // Dependencies from `pimple/pimple`
 10: use Pimple\ServiceProviderInterface;
 11: use Pimple\Container;
 12: 
 13: // Intra-module (`charcoal-app`) dependencies
 14: use Charcoal\App\Config\DatabaseConfig;
 15: 
 16: /**
 17:  * Database Service Provider. Configures and provides a PDO service to a container.
 18:  *
 19:  * ## Services
 20:  *
 21:  * - `database` The `\PDO` instance.
 22:  * - `databases` Container of all availables `\PDO` databases.
 23:  *
 24:  * ## Helpers
 25:  *
 26:  * - `database/config` A `DatabaseConfig` object containing the DB settings.
 27:  * - `databases/config A container of `DatabaseConfig`
 28:  */
 29: class DatabaseServiceProvider implements ServiceProviderInterface
 30: {
 31:     /**
 32:      * Registers services on the given container.
 33:      *
 34:      * This method should only be used to configure services and parameters.
 35:      * It should not get services.
 36:      *
 37:      * @param Container $container A container instance.
 38:      * @return void
 39:      */
 40:     public function register(Container $container)
 41:     {
 42:         /**
 43:          * @param Container $container A container instance.
 44:          * @return Container The Collection of DatabaseSourceConfig, in a Container.
 45:          */
 46:         $container['databases/config'] = function (Container $container) {
 47:             $config = $container['config'];
 48:             $databases = $config['databases'];
 49:             $configs = new Container();
 50:             foreach ($databases as $dbIdent => $dbOptions) {
 51:                 $configs[$dbIdent] = new DatabaseConfig($dbOptions);
 52:             }
 53:             return $configs;
 54:         };
 55: 
 56:         /**
 57:          * @param Container $container A container instance.
 58:          * @return Container
 59:          */
 60:         $container['databases'] = function (Container $container) {
 61:             $config = $container['config'];
 62:             $databases = $config['databases'];
 63:             $dbs = new Container();
 64:             $origContainer = $container;
 65:             foreach ($databases as $dbIdent => $dbOptions) {
 66:                 unset($dbOptions);
 67: 
 68:                 /**
 69:                  * @param Container $container A container instance.
 70:                  * @return PDO
 71:                  */
 72:                 $dbs[$dbIdent] = function () use ($dbIdent, $origContainer) {
 73:                     $dbConfigs = $origContainer['databases/config'];
 74:                     $dbConfig = $dbConfigs[$dbIdent];
 75: 
 76:                     $type = $dbConfig['type'];
 77:                     $host = $dbConfig['hostname'];
 78: 
 79:                     $database = $dbConfig['database'];
 80:                     $username = $dbConfig['username'];
 81:                     $password = $dbConfig['password'];
 82: 
 83:                     // Set UTf-8 compatibility by default. Disable it if it is set as such in config
 84:                     $extraOptions = null;
 85:                     if (!isset($dbConfig['disable_utf8']) || !$dbConfig['disable_utf8']) {
 86:                         $extraOptions = [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4'];
 87:                     }
 88: 
 89:                     if ($type == 'sqlite') {
 90:                         $dsn = $type.':'.$database;
 91:                     } else {
 92:                         $dsn = $type.':host='.$host.';dbname='.$database;
 93:                     }
 94:                     $db = new PDO($dsn, $username, $password, $extraOptions);
 95: 
 96:                     // Set PDO options
 97:                     $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 98:                     if ($type == 'mysql') {
 99:                         $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
100:                     }
101:                     return $db;
102:                 };
103:             }
104:             return $dbs;
105:         };
106: 
107:         /**
108:          * @param Container $container A container instance.
109:          * @return DatabaseSourceConfig
110:          */
111:         $container['database/config'] = function (Container $container) {
112:             $config = $container['config'];
113:             $databaseIdent = $config['default_database'];
114:             return $container['databases/config'][$databaseIdent];
115:         };
116: 
117:         /**
118:          * The database service, as a PDO object.
119:          *
120:          * @param Container $container A container instance.
121:          * @throws Exception If the database configuration is invalid.
122:          * @return PDO
123:          */
124:         $container['database'] = function (Container $container) {
125:             $config = $container['config'];
126:             $databaseIdent = $config['default_database'];
127:             $databases = $container['databases'];
128:             if (!isset($databases[$databaseIdent])) {
129:                 throw new Exception(
130:                     sprintf('The database "%s" is not defined in the "databases" configuration.', $databaseIdent)
131:                 );
132:             }
133:             return $databases[$databaseIdent];
134:         };
135:     }
136: }
137: 
API documentation generated by ApiGen