OSDN Git Service

- followed ini file name changes.
[ethna/ethna.git] / class / Ethna_Backend.php
1 <?php
2 // vim: foldmethod=marker
3 /**
4  *  Ethna_Backend.php
5  *
6  *  @author     Masaki Fujimoto <fujimoto@php.net>
7  *  @license    http://www.opensource.org/licenses/bsd-license.php The BSD License
8  *  @package    Ethna
9  *  @version    $Id$
10  */
11
12 // {{{ Ethna_Backend
13 /**
14  *  バックエンド処理クラス
15  *
16  *  @author     Masaki Fujimoto <fujimoto@php.net>
17  *  @access     public
18  *  @package    Ethna
19  */
20 class Ethna_Backend
21 {
22     /**#@+
23      *  @access     private
24      */
25
26     /** @var    object  Ethna_Controller    controllerオブジェクト */
27     var $controller;
28
29     /** @var    object  Ethna_Controller    controllerオブジェクト($controllerの省略形) */
30     var $ctl;
31
32     /** @var    object  Ethna_ClassFactory  クラスファクトリオブジェクト */
33     var $class_factory;
34
35     /** @var    object  Ethna_Config        設定オブジェクト */
36     var $config;
37
38     /** @var    object  Ethna_I18N          i18nオブジェクト */
39     var $i18n;
40
41     /** @var    object  Ethna_ActionError   アクションエラーオブジェクト */
42     var $action_error;
43
44     /** @var    object  Ethna_ActionError   アクションエラーオブジェクト($action_errorの省略形) */
45     var $ae;
46
47     /** @var    object  Ethna_ActionForm    アクションフォームオブジェクト */
48     var $action_form;
49
50     /** @var    object  Ethna_ActionForm    アクションフォームオブジェクト($action_formの省略形) */
51     var $af;
52
53     /** @var    object  Ethna_ActionClass   アクションクラスオブジェクト */
54     var $action_class;
55
56     /** @var    object  Ethna_ActionClass   アクションクラスオブジェクト($action_classの省略形) */
57     var $ac;
58
59     /** @var    object  Ethna_Session       セッションオブジェクト */
60     var $session;
61
62     /** @var    object  Ethna_Plugin        プラグインオブジェクト */
63     var $plugin;
64
65     /** @var    array   Ethna_DBオブジェクトを格納した配列 */
66     var $db_list;
67
68     /** @var    object  Ethna_Logger        ログオブジェクト */
69     var $logger;
70
71     /**#@-*/
72
73
74     /**
75      *  Ethna_Backendクラスのコンストラクタ
76      *
77      *  @access public
78      *  @param  object  Ethna_Controller    &$controller    コントローラオブジェクト
79      */
80     function Ethna_Backend(&$controller)
81     {
82         // オブジェクトの設定
83         $this->controller =& $controller;
84         $this->ctl =& $this->controller;
85
86         $this->class_factory =& $controller->getClassFactory();
87
88         $this->config =& $controller->getConfig();
89         $this->i18n =& $controller->getI18N();
90
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;
97
98         $this->session =& $this->controller->getSession();
99         $this->plugin =& $this->controller->getPlugin();
100         $this->db_list = array();
101         $this->logger =& $this->controller->getLogger();
102     }
103
104     /**
105      *  controllerオブジェクトへのアクセサ(R)
106      *
107      *  @access public
108      *  @return object  Ethna_Controller    controllerオブジェクト
109      */
110     function &getController()
111     {
112         return $this->controller;
113     }
114
115     /**
116      *  設定オブジェクトへのアクセサ(R)
117      *
118      *  @access public
119      *  @return object  Ethna_Config        設定オブジェクト
120      */
121     function &getConfig()
122     {
123         return $this->config;
124     }
125
126     /**
127      *  アプリケーションIDを返す
128      *
129      *  @access public
130      *  @return string  アプリケーションID
131      */
132     function getAppId()
133     {
134         return $this->controller->getAppId();
135     }
136
137     /**
138      *  I18Nオブジェクトのアクセサ(R)
139      *
140      *  @access public
141      *  @return object  Ethna_I18N  i18nオブジェクト
142      */
143     function &getI18N()
144     {
145         return $this->i18n;
146     }
147
148     /**
149      *  アクションエラーオブジェクトのアクセサ(R)
150      *
151      *  @access public
152      *  @return object  Ethna_ActionError   アクションエラーオブジェクト
153      */
154     function &getActionError()
155     {
156         return $this->action_error;
157     }
158
159     /**
160      *  アクションフォームオブジェクトのアクセサ(R)
161      *
162      *  @access public
163      *  @return object  Ethna_ActionForm    アクションフォームオブジェクト
164      */
165     function &getActionForm()
166     {
167         return $this->action_form;
168     }
169
170     /**
171      *  アクションフォームオブジェクトのアクセサ(W)
172      *
173      *  @access public
174      */
175     function setActionForm(&$action_form)
176     {
177         $this->action_form =& $action_form;
178         $this->af =& $action_form;
179     }
180
181     /**
182      *  実行中のアクションクラスオブジェクトのアクセサ(R)
183      *
184      *  @access public
185      *  @return mixed   Ethna_ActionClass:アクションクラス null:アクションクラス未定
186      */
187     function &getActionClass()
188     {
189         return $this->action_class;
190     }
191
192     /**
193      *  実行中のアクションクラスオブジェクトのアクセサ(W)
194      *
195      *  @access public
196      */
197     function setActionClass(&$action_class)
198     {
199         $this->action_class =& $action_class;
200         $this->ac =& $action_class;
201     }
202
203     /**
204      *  ログオブジェクトのアクセサ(R)
205      *
206      *  @access public
207      *  @return object  Ethna_Logger    ログオブジェクト
208      */
209     function &getLogger()
210     {
211         return $this->logger;
212     }
213
214     /**
215      *  セッションオブジェクトのアクセサ(R)
216      *
217      *  @access public
218      *  @return object  Ethna_Session   セッションオブジェクト
219      */
220     function &getSession()
221     {
222         return $this->session;
223     }
224
225     /**
226      *  プラグインオブジェクトのアクセサ(R)
227      *
228      *  @access public
229      *  @return object  Ethna_Plugin    プラグインオブジェクト
230      */
231     function &getPlugin()
232     {
233         return $this->plugin;
234     }
235
236     /**
237      *  マネージャオブジェクトへのアクセサ(R)
238      *
239      *  @access public
240      *  @return object  Ethna_AppManager    マネージャオブジェクト
241      */
242     function &getManager($type, $weak = false)
243     {
244         $_ret_object =& $this->class_factory->getManager($type, $weak);
245         return $_ret_object;
246     }
247
248     /**
249      *  オブジェクトへのアクセサ(R)
250      *
251      *  @access public
252      *  @return mixed   $keyに対応するオブジェクト(or null)
253      */
254     function &getObject($key)
255     {
256         $arg_list = func_get_args();
257         array_shift($arg_list);
258         $_ret_object =& $this->class_factory->getObject($key, $arg_list);
259         return $_ret_object;
260     }
261
262     /**
263      *  アプリケーションのベースディレクトリを取得する
264      *
265      *  @access public
266      *  @return string  ベースディレクトリのパス名
267      */
268     function getBasedir()
269     {
270         return $this->controller->getBasedir();
271     }
272
273     /**
274      *  アプリケーションのテンプレートディレクトリを取得する
275      *
276      *  @access public
277      *  @return string  テンプレートディレクトリのパス名
278      */
279     function getTemplatedir()
280     {
281         return $this->controller->getTemplatedir();
282     }
283
284     /**
285      *  アプリケーションの設定ディレクトリを取得する
286      *
287      *  @access public
288      *  @return string  設定ディレクトリのパス名
289      */
290     function getEtcdir()
291     {
292         return $this->controller->getDirectory('etc');
293     }
294
295     /**
296      *  アプリケーションのテンポラリディレクトリを取得する
297      *
298      *  @access public
299      *  @return string  テンポラリディレクトリのパス名
300      */
301     function getTmpdir()
302     {
303         return $this->controller->getDirectory('tmp');
304     }
305
306     /**
307      *  アプリケーションのテンプレートファイル拡張子を取得する
308      *
309      *  @access public
310      *  @return string  テンプレートファイルの拡張子
311      */
312     function getTemplateext()
313     {
314         return $this->controller->getExt('tpl');
315     }
316
317     /**
318      *  ログを出力する
319      *
320      *  @access public
321      *  @param  int     $level      ログレベル(LOG_DEBUG, LOG_NOTICE...)
322      *  @param  string  $message    ログメッセージ(printf形式)
323      */
324     function log($level, $message)
325     {
326         $args = func_get_args();
327         if (count($args) > 2) {
328             array_splice($args, 0, 2);
329             $message = vsprintf($message, $args);
330         }
331         $this->logger->log($level, $message);
332     }
333
334     /**
335      *  バックエンド処理を実行する
336      *
337      *  @access public
338      *  @param  string  $action_name    実行するアクションの名称
339      *  @return mixed   (string):Forward名(nullならforwardしない) Ethna_Error:エラー
340      */
341     function perform($action_name)
342     {
343         $forward_name = null;
344
345         $action_class_name = $this->controller->getActionClassName($action_name);
346         $this->action_class =& new $action_class_name($this);
347         $this->ac =& $this->action_class;
348
349         // アクションの実行
350         $forward_name = $this->ac->authenticate();
351         if ($forward_name === false) {
352             return null;
353         } else if ($forward_name !== null) {
354             return $forward_name;
355         }
356
357         $forward_name = $this->ac->prepare();
358         if ($forward_name === false) {
359             return null;
360         } else if ($forward_name !== null) {
361             return $forward_name;
362         }
363
364         $forward_name = $this->ac->perform();
365
366         return $forward_name;
367     }
368
369     /**
370      *  DBオブジェクトを返す
371      *
372      *  @access public
373      *  @param  string  $db_key DBキー
374      *  @return mixed   Ethna_DB:DBオブジェクト null:DSN設定なし Ethna_Error:エラー
375      *  @todo   この中でnewしないでclass factoryを利用する
376      */
377     function &getDB($db_key = "")
378     {
379         $null = null;
380         $db_varname =& $this->_getDBVarname($db_key);
381
382         if (Ethna::isError($db_varname)) {
383             return $db_varname;
384         }
385
386         if (isset($this->db_list[$db_varname]) && $this->db_list[$db_varname] != null) {
387             return $this->db_list[$db_varname];
388         }
389
390         $dsn = $this->controller->getDSN($db_key);
391
392         if ($dsn == "") {
393             // DB接続不要
394             return $null;
395         }
396
397         $dsn_persistent = $this->controller->getDSN_persistent($db_key);
398
399         $class_factory =& $this->controller->getClassFactory();
400         $db_class_name = $class_factory->getObjectName('db');
401         
402         // BC: Ethna_DB -> Ethna_DB_PEAR
403         if ($db_class_name == 'Ethna_DB') {
404             $db_class_name = 'Ethna_DB_PEAR';
405         }
406         if (class_exists($db_class_name) === false) {
407             $class_factory->_include($db_class_name);
408         }
409
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;
414             return $r;
415         }
416
417         register_shutdown_function(array(&$this, 'shutdownDB'));
418
419         return $this->db_list[$db_varname];
420     }
421
422     /**
423      *  DBオブジェクト(全て)を取得する
424      *
425      *  @access public
426      *  @return mixed   array:Ethna_DBオブジェクトの一覧 Ethan_Error:(いずれか一つ以上の接続で)エラー
427      */
428     function getDBList()
429     {
430         $r = array();
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)) {
435                 return $r;
436             }
437             $elt = array();
438             $elt['db'] =& $db;
439             $elt['key'] = $db_key;
440             $elt['type'] = $db_type;
441             $elt['varname'] = "db";
442             if ($db_key != "") {
443                 $elt['varname'] = sprintf("db_%s", strtolower($db_key));
444             }
445             $r[] = $elt;
446         }
447         return $r;
448     }
449
450     /**
451      *  DBコネクションを切断する
452      *
453      *  @access public
454      */
455     function shutdownDB()
456     {
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]);
461             }
462         }
463     }
464
465     /**
466      *  指定されたDBキーに対応する(当該DBオブジェクトを格納するための)メンバ変数名を取得する
467      *
468      *  正直もう要らないのですが、後方互換性維持のために一応残してある状態です
469      *  (Ethna_AppManagerクラスなどで、$this->dbとかしている箇所が少なからずあ
470      *  るので)
471      *
472      *  @access private
473      *  @param  string  $db_key DBキー
474      *  @return mixed   string:メンバ変数名 Ethna_Error:不正なDB種別
475      */
476     function &_getDBVarname($db_key = "")
477     {
478         $r = $this->controller->getDBType($db_key);
479         if (is_null($r)) {
480             return Ethna::raiseError("Undefined DB Type [%s]", E_DB_INVALIDTYPE, $db_key);
481         }
482
483         if ($db_key == "") {
484             $db_varname = "";
485         } else {
486             $db_varname = sprintf("%s", strtolower($db_key));
487         }
488
489         return $db_varname;
490     }
491 }
492 // }}}