a tiny mvc framework for php using php-activerecord
at master 205 lines 6.1 kB view raw
1<?php 2/* 3 configuration 4*/ 5 6namespace HalfMoon; 7 8class Config extends Singleton { 9 public static $LOG_LEVELS = array( 10 "none" => 0, 11 "short" => 5, 12 "full" => 10, 13 ); 14 public static $DEFAULT_LOG_LEVEL = "full"; 15 public static $DEFAULT_ACTIVERECORD_LOG_LEVEL = "none"; 16 17 public $activerecord; 18 public $db_config; 19 20 public $activerecord_log_level; 21 public $cache_store_path; 22 public $exception_notification_recipient; 23 public $exception_notification_subject; 24 public $log_handler; 25 public $log_level; 26 27 public function __construct() { 28 $this->log_level = static::$LOG_LEVELS[static::$DEFAULT_LOG_LEVEL]; 29 $this->activerecord_log_level = 30 static::$LOG_LEVELS[static::$DEFAULT_ACTIVERECORD_LOG_LEVEL]; 31 32 /* legacy setting was just to log everything */ 33 if (isset($GLOBALS['ACTIVERECORD_LOG']) && $GLOBALS['ACTIVERECORD_LOG']) 34 $this->activerecord_log_level = static::$LOG_LEVELS["full"]; 35 } 36 37 /* load an ini file, make sure each environment's config has some proper 38 * defaults, and then cache it */ 39 public static function load_db_config() { 40 if (Config::instance()->db_config) 41 return Config::instance()->db_config; 42 43 $db_config = parse_ini_file(HALFMOON_ROOT . "/config/db.ini", true); 44 45 /* set some reasonable defaults */ 46 $ar_config = array(); 47 foreach ($db_config as $henv => $db) { 48 if ($db["adapter"] == "sqlite") 49 $ar_config[$henv] = $db; 50 else 51 $ar_config[$henv] = array_merge(array( 52 "adapter" => "mysql", 53 "username" => "username", 54 "password" => "password", 55 "hostname" => "localhost", 56 "database" => "database", 57 "socket" => "", 58 "port" => 3306, 59 ), $db); 60 } 61 62 return Config::instance()->db_config = $ar_config; 63 } 64 65 public static function initialize_activerecord() { 66 Config::instance()->activerecord = \ActiveRecord\Config::instance(); 67 Config::instance()->activerecord->set_model_directory(realpath(HALFMOON_ROOT 68 . "/models/")); 69 70 /* turn our array of db configs (from the ini file) into php-ar 71 * connection strings */ 72 $dbs = Config::instance()->load_db_config(); 73 $ar_dbs = array(); 74 foreach ($dbs as $henv => $db) { 75 if ($db["adapter"] == "sqlite") { 76 $db_path = $db["database"]; 77 if (substr($db_path, 0, 1) != "/") 78 $db_path = realpath(HALFMOON_ROOT . "/" . $db_path); 79 80 $ar_dbs[$henv] = $db["adapter"] . "://unix(" . $db_path . ")" 81 . (empty($db["charset"]) ? "" : 82 "?charset=" . $db["charset"]); 83 } else { 84 if ($db["socket"] == "") 85 $host = $db["hostname"] . ":" . $db["port"]; 86 else 87 $host = "unix(" . $db["socket"] . ")"; 88 89 /* masked strings will be shown in rescue messages */ 90 $ar_dbs[$henv] = new StringMaskedDuringRescue($db["adapter"] 91 . "://" . $db["username"] . ":" . $db["password"] . "@" 92 . $host . "/" . $db["database"] 93 . (empty($db["charset"]) ? "" : 94 "?charset=" . $db["charset"]), 95 $db["adapter"] . "://****/" . $db["database"]); 96 } 97 } 98 99 if (!isset($ar_dbs[HALFMOON_ENV])) 100 throw new \HalfMoon\HalfMoonException("no database configuration " 101 . "found for \"" . HALFMOON_ENV . "\" environment"); 102 103 Config::instance()->activerecord->set_connections($ar_dbs); 104 Config::instance()->activerecord->set_default_connection(HALFMOON_ENV); 105 106 Config::instance()->initialize_activerecord_logger(); 107 } 108 109 private static function initialize_activerecord_logger() { 110 if (Config::instance()->activerecord_log_level > 111 static::$LOG_LEVELS["none"]) { 112 Config::instance()->activerecord->set_logging(true); 113 Config::instance()->activerecord->set_logger( 114 new \HalfMoon\ActiveRecordLogger( 115 Config::instance()->activerecord_log_level)); 116 } else { 117 Config::instance()->activerecord->set_logging(false); 118 Config::instance()->activerecord->set_logger( 119 new \HalfMoon\ActiveRecordLogger); 120 } 121 } 122 123 public static function set_session_store($store, $options = array()) { 124 switch (strtolower($store)) { 125 case "encrypted_cookie": 126 require_once(HALFMOON_ROOT 127 . "/halfmoon/lib/session_store/encrypted_cookie.php"); 128 129 ini_set("session.save_handler", "user"); 130 131 /* TODO: warn about suhosin stuff? */ 132 133 $session = new \HalfMoon\EncryptedCookieSessionStore( 134 $options["encryption_key"]); 135 session_set_save_handler( 136 array($session, "open"), 137 array($session, "close"), 138 array($session, "read"), 139 array($session, "write"), 140 array($session, "destroy"), 141 array($session, "gc") 142 ); 143 144 break; 145 146 case "default": 147 ini_set("session.save_handler", "files"); 148 break; 149 150 default: 151 throw new \HalfMoon\HalfMoonException("unknown session store: " 152 . $store); 153 } 154 } 155 156 public static function set_exception_notification_recipient($recipient) { 157 Config::instance()->exception_notification_recipient = $recipient; 158 } 159 160 public static function set_exception_notification_subject($subject) { 161 Config::instance()->exception_notification_subject = $subject; 162 } 163 164 public static function set_log_handler($class) { 165 if (!class_exists($class, false)) 166 throw new \HalfMoon\HalfMoonException("log handler class \"" 167 . $class . "\" does not exist"); 168 169 Config::instance()->log_handler = $class; 170 } 171 172 public static function set_log_level($level) { 173 if (!isset(static::$LOG_LEVELS[$level])) 174 throw new \HalfMoon\HalfMoonException("unknown log level: " 175 . $level); 176 177 Config::instance()->log_level = static::$LOG_LEVELS[$level]; 178 } 179 180 public static function set_cache_store_path($path) { 181 Config::instance()->cache_store_path = $path; 182 } 183 184 public static function set_activerecord_log_level($level) { 185 if (!isset(static::$LOG_LEVELS[$level])) 186 throw new \HalfMoon\HalfMoonException("unknown log level: " 187 . $level); 188 189 Config::instance()->activerecord_log_level = 190 static::$LOG_LEVELS[$level]; 191 192 if (Config::instance()->activerecord) 193 Config::initialize_activerecord_logger(); 194 } 195 196 public static function log_level_at_least($level) { 197 if (!isset(static::$LOG_LEVELS[$level])) 198 throw new \HalfMoon\HalfMoonException("unknown log level: " 199 . $level); 200 201 return (Config::instance()->log_level >= static::$LOG_LEVELS[$level]); 202 } 203} 204 205?>