a tiny mvc framework for php using php-activerecord
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?>