2 // vim: foldmethod=marker
6 * @author Masaki Fujimoto <fujimoto@php.net>
7 * @license http://www.opensource.org/licenses/bsd-license.php The BSD License
16 * @author Masaki Fujimoto <fujimoto@php.net>
26 /** @var object Ethna_Controller controllerオブジェクト */
29 /** @var object Ethna_Controller controllerオブジェクト($controllerの省略形) */
32 /** @var object Ethna_ClassFactory クラスファクトリオブジェクト */
35 /** @var object Ethna_Config 設定オブジェクト */
38 /** @var object Ethna_I18N i18nオブジェクト */
41 /** @var object Ethna_ActionError アクションエラーオブジェクト */
44 /** @var object Ethna_ActionError アクションエラーオブジェクト($action_errorの省略形) */
47 /** @var object Ethna_ActionForm アクションフォームオブジェクト */
50 /** @var object Ethna_ActionForm アクションフォームオブジェクト($action_formの省略形) */
53 /** @var object Ethna_ActionClass アクションクラスオブジェクト */
56 /** @var object Ethna_ActionClass アクションクラスオブジェクト($action_classの省略形) */
59 /** @var object Ethna_Session セッションオブジェクト */
62 /** @var object Ethna_Plugin プラグインオブジェクト */
65 /** @var array Ethna_DBオブジェクトを格納した配列 */
68 /** @var object Ethna_Logger ログオブジェクト */
75 * Ethna_Backendクラスのコンストラクタ
78 * @param object Ethna_Controller &$controller コントローラオブジェクト
80 function Ethna_Backend(&$controller)
83 $this->controller =& $controller;
84 $this->ctl =& $this->controller;
86 $this->class_factory =& $controller->getClassFactory();
88 $this->config =& $controller->getConfig();
89 $this->i18n =& $controller->getI18N();
91 $this->action_error =& $controller->getActionError();
92 $this->ae =& $this->action_error;
93 $this->action_form =& $controller->getActionForm();
94 $this->af =& $this->action_form;
95 $this->action_class = null;
96 $this->ac =& $this->action_class;
98 $this->session =& $this->controller->getSession();
99 $this->plugin =& $this->controller->getPlugin();
100 $this->db_list = array();
101 $this->logger =& $this->controller->getLogger();
105 * controllerオブジェクトへのアクセサ(R)
108 * @return object Ethna_Controller controllerオブジェクト
110 function &getController()
112 return $this->controller;
119 * @return object Ethna_Config 設定オブジェクト
121 function &getConfig()
123 return $this->config;
130 * @return string アプリケーションID
134 return $this->controller->getAppId();
141 * @return object Ethna_I18N i18nオブジェクト
149 * アクションエラーオブジェクトのアクセサ(R)
152 * @return object Ethna_ActionError アクションエラーオブジェクト
154 function &getActionError()
156 return $this->action_error;
160 * アクションフォームオブジェクトのアクセサ(R)
163 * @return object Ethna_ActionForm アクションフォームオブジェクト
165 function &getActionForm()
167 return $this->action_form;
171 * アクションフォームオブジェクトのアクセサ(W)
175 function setActionForm(&$action_form)
177 $this->action_form =& $action_form;
178 $this->af =& $action_form;
182 * 実行中のアクションクラスオブジェクトのアクセサ(R)
185 * @return mixed Ethna_ActionClass:アクションクラス null:アクションクラス未定
187 function &getActionClass()
189 return $this->action_class;
193 * 実行中のアクションクラスオブジェクトのアクセサ(W)
197 function setActionClass(&$action_class)
199 $this->action_class =& $action_class;
200 $this->ac =& $action_class;
207 * @return object Ethna_Logger ログオブジェクト
209 function &getLogger()
211 return $this->logger;
215 * セッションオブジェクトのアクセサ(R)
218 * @return object Ethna_Session セッションオブジェクト
220 function &getSession()
222 return $this->session;
226 * プラグインオブジェクトのアクセサ(R)
229 * @return object Ethna_Plugin プラグインオブジェクト
231 function &getPlugin()
233 return $this->plugin;
237 * マネージャオブジェクトへのアクセサ(R)
240 * @return object Ethna_AppManager マネージャオブジェクト
242 function &getManager($type, $weak = false)
244 $_ret_object =& $this->class_factory->getManager($type, $weak);
252 * @return mixed $keyに対応するオブジェクト(or null)
254 function &getObject($key)
256 $arg_list = func_get_args();
257 array_shift($arg_list);
258 $_ret_object =& $this->class_factory->getObject($key, $arg_list);
263 * アプリケーションのベースディレクトリを取得する
266 * @return string ベースディレクトリのパス名
268 function getBasedir()
270 return $this->controller->getBasedir();
274 * アプリケーションのテンプレートディレクトリを取得する
277 * @return string テンプレートディレクトリのパス名
279 function getTemplatedir()
281 return $this->controller->getTemplatedir();
285 * アプリケーションの設定ディレクトリを取得する
288 * @return string 設定ディレクトリのパス名
292 return $this->controller->getDirectory('etc');
296 * アプリケーションのテンポラリディレクトリを取得する
299 * @return string テンポラリディレクトリのパス名
303 return $this->controller->getDirectory('tmp');
307 * アプリケーションのテンプレートファイル拡張子を取得する
310 * @return string テンプレートファイルの拡張子
312 function getTemplateext()
314 return $this->controller->getExt('tpl');
321 * @param int $level ログレベル(LOG_DEBUG, LOG_NOTICE...)
322 * @param string $message ログメッセージ(printf形式)
324 function log($level, $message)
326 $args = func_get_args();
327 if (count($args) > 2) {
328 array_splice($args, 0, 2);
329 $message = vsprintf($message, $args);
331 $this->logger->log($level, $message);
338 * @param string $action_name 実行するアクションの名称
339 * @return mixed (string):Forward名(nullならforwardしない) Ethna_Error:エラー
341 function perform($action_name)
343 $forward_name = null;
345 $action_class_name = $this->controller->getActionClassName($action_name);
346 $this->action_class =& new $action_class_name($this);
347 $this->ac =& $this->action_class;
350 $forward_name = $this->ac->authenticate();
351 if ($forward_name === false) {
353 } else if ($forward_name !== null) {
354 return $forward_name;
357 $forward_name = $this->ac->prepare();
358 if ($forward_name === false) {
360 } else if ($forward_name !== null) {
361 return $forward_name;
364 $forward_name = $this->ac->perform();
366 return $forward_name;
373 * @param string $db_key DBキー
374 * @return mixed Ethna_DB:DBオブジェクト null:DSN設定なし Ethna_Error:エラー
375 * @todo この中でnewしないでclass factoryを利用する
377 function &getDB($db_key = "")
380 $db_varname =& $this->_getDBVarname($db_key);
382 if (Ethna::isError($db_varname)) {
386 if (isset($this->db_list[$db_varname]) && $this->db_list[$db_varname] != null) {
387 return $this->db_list[$db_varname];
390 $dsn = $this->controller->getDSN($db_key);
397 $dsn_persistent = $this->controller->getDSN_persistent($db_key);
399 $class_factory =& $this->controller->getClassFactory();
400 $db_class_name = $class_factory->getObjectName('db');
402 // BC: Ethna_DB -> Ethna_DB_PEAR
403 if ($db_class_name == 'Ethna_DB') {
404 $db_class_name = 'Ethna_DB_PEAR';
406 if (class_exists($db_class_name) === false) {
407 $class_factory->_include($db_class_name);
410 $this->db_list[$db_varname] =& new $db_class_name($this->controller, $dsn, $dsn_persistent);
411 $r = $this->db_list[$db_varname]->connect();
412 if (Ethna::isError($r)) {
413 $this->db_list[$db_varname] = null;
417 register_shutdown_function(array(&$this, 'shutdownDB'));
419 return $this->db_list[$db_varname];
426 * @return mixed array:Ethna_DBオブジェクトの一覧 Ethan_Error:(いずれか一つ以上の接続で)エラー
431 $db_define_list = $this->controller->getDBType();
432 foreach ($db_define_list as $db_key => $db_type) {
433 $db =& $this->getDB($db_key);
434 if (Ethna::isError($db)) {
439 $elt['key'] = $db_key;
440 $elt['type'] = $db_type;
441 $elt['varname'] = "db";
443 $elt['varname'] = sprintf("db_%s", strtolower($db_key));
455 function shutdownDB()
457 foreach (array_keys($this->db_list) as $key) {
458 if ($this->db_list[$key] != null && $this->db_list[$key]->isValid()) {
459 $this->db_list[$key]->disconnect();
460 unset($this->db_list[$key]);
466 * 指定されたDBキーに対応する(当該DBオブジェクトを格納するための)メンバ変数名を取得する
468 * 正直もう要らないのですが、後方互換性維持のために一応残してある状態です
469 * (Ethna_AppManagerクラスなどで、$this->dbとかしている箇所が少なからずあ
473 * @param string $db_key DBキー
474 * @return mixed string:メンバ変数名 Ethna_Error:不正なDB種別
476 function &_getDBVarname($db_key = "")
478 $r = $this->controller->getDBType($db_key);
480 return Ethna::raiseError("Undefined DB Type [%s]", E_DB_INVALIDTYPE, $db_key);
486 $db_varname = sprintf("%s", strtolower($db_key));