App.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. <?php
  2. namespace KarmaFW;
  3. use \KarmaFW\Lib\Hooks\HooksManager;
  4. //use \KarmaFW\Database\Sql\SqlDb;
  5. //use \KarmaFW\Database\Sql\SqlOrmModel;
  6. class App
  7. {
  8. protected static $booted = false;
  9. protected static $helpers_dirs = [
  10. APP_DIR . "/src/helpers",
  11. FW_SRC_DIR . "/helpers",
  12. ];
  13. public static $db = null;
  14. public static $data = [];
  15. /* #### */
  16. public static function boot()
  17. {
  18. define('FW_SRC_DIR', __DIR__);
  19. define('FW_DIR', __DIR__ . "/..");
  20. if (! defined('APP_DIR')) {
  21. echo "ERROR: Please, define APP_DIR" . PHP_EOL;
  22. exit(1);
  23. }
  24. if (defined('USE_HOOKS') && USE_HOOKS) {
  25. HooksManager::applyHook('app.boot.before', []);
  26. }
  27. // TODO: config à migrer dans un fichier .env et .env.prod et .env.dev et .env.local (à charger dans cet ordre, avec overwrite)
  28. if (is_file(APP_DIR . '/config/config.php')) {
  29. require APP_DIR . '/config/config.php';
  30. }
  31. if (! defined('APP_NAME')) {
  32. define('APP_NAME', "PHP Application");
  33. }
  34. if (! defined('TPL_DIR')) {
  35. //define('TPL_DIR', APP_DIR . '/templates');
  36. }
  37. if (! defined('ENV')) {
  38. define('ENV', 'prod');
  39. }
  40. if (! defined('DB_DSN')) {
  41. //define('DB_DSN', 'mysql://root@localhost/my_app');
  42. }
  43. if (! defined('ERROR_TEMPLATE')) {
  44. //define('ERROR_TEMPLATE', "page_error.tpl.php");
  45. }
  46. // move fw_helpers at the end of the list (to be loaded the last one)
  47. /*
  48. if (count(self::$helpers_dirs) > 1) {
  49. $fw_helpers = array_shift(self::$helpers_dirs);
  50. self::$helpers_dirs[] = $fw_helpers;
  51. }
  52. */
  53. // include helpers
  54. foreach (self::$helpers_dirs as $helpers_dir) {
  55. self::loadHelpers($helpers_dir);
  56. }
  57. // define class aliases
  58. class_alias('\\KarmaFW\\App', 'App');
  59. //class_alias('\\KarmaFW\\Database\\Sql\\SqlDb', 'SqlDb');
  60. //class_alias('\\KarmaFW\\Database\\Sql\\SqlSchema', 'SqlSchema');
  61. //class_alias('\\KarmaFW\\Database\\Sql\\SqlTable', 'SqlTable');
  62. //class_alias('\\KarmaFW\\Database\\Sql\\SqlOrmModel', 'SqlOrmModel');
  63. //class_alias('\\KarmaFW\\Database\\Sql\\SqlQuery', 'SqlQuery');
  64. //class_alias('\\KarmaFW\\Database\\Sql\\SqlWhere', 'SqlWhere');
  65. //class_alias('\\KarmaFW\\Database\\Sql\\SqlExpr', 'SqlExpr');
  66. //class_alias('\\KarmaFW\\Database\\Sql\\SqlLike', 'SqlLike');
  67. //class_alias('\\KarmaFW\\Database\\Sql\\SqlIn', 'SqlIn');
  68. //class_alias('\\KarmaFW\\Database\\Sql\\SqlTools', 'SqlTools');
  69. if (defined('DB_DSN')) {
  70. self::$db = static::getDb();
  71. }
  72. // ERRORS HANDLER // NOTE => a déplacer dans \KarmaFW\WebApp::boot() ??
  73. if (defined('ENV') && ENV == 'dev') {
  74. $whoops = new \Whoops\Run;
  75. $whoops->prependHandler(new \Whoops\Handler\PrettyPageHandler);
  76. $whoops->register();
  77. }
  78. if (defined('USE_HOOKS') && USE_HOOKS) {
  79. HooksManager::applyHook('app.boot.after', []);
  80. }
  81. self::$booted = true;
  82. }
  83. public static function registerHelpersDir($dir)
  84. {
  85. $dir = rtrim($dir, '/');
  86. if (! in_array($dir, self::$helpers_dirs)) {
  87. self::$helpers_dirs[] = $dir;
  88. }
  89. }
  90. public static function setData($key, $value=null)
  91. {
  92. self::$data[$key] = $value;
  93. }
  94. public static function getData($key, $default_value=null)
  95. {
  96. return array_key_exists($key, self::$data) ? self::$data[$key] : $default_value;
  97. }
  98. public static function hasData($key)
  99. {
  100. return array_key_exists($key, self::$data);
  101. }
  102. public static function unregisterHelpersDir($dir)
  103. {
  104. $dir = rtrim($dir, '/');
  105. $k = array_search($dir, self::$helpers_dirs);
  106. if ($k !== false) {
  107. unset(self::$helpers_dirs[$k]);
  108. }
  109. }
  110. protected static function loadHelpersDirs()
  111. {
  112. if (is_array(self::$helpers_dirs)) {
  113. foreach (self::$helpers_dirs as $helpers_dir) {
  114. self::loadHelpers($helpers_dir);
  115. }
  116. }
  117. }
  118. public static function loadHelpers($dir)
  119. {
  120. $helpers = glob($dir . '/helpers_*.php');
  121. foreach ($helpers as $helper) {
  122. require $helper;
  123. }
  124. }
  125. public static function isCli()
  126. {
  127. return (php_sapi_name() == 'cli');
  128. }
  129. public static function getDb($instance_name=null, $dsn=null)
  130. {
  131. /*
  132. $dsn = 'mysql://user:pass@localhost/my_app';
  133. */
  134. static $instances = [];
  135. static $last_instance_name = null;
  136. if (empty($instance_name)) {
  137. if (! empty(self::$db)) {
  138. return self::$db;
  139. }
  140. $instance_name = 'default';
  141. //if (! empty($last_instance_name)) {
  142. // $instance_name = $last_instance_name;
  143. //}
  144. }
  145. $last_instance_name = $instance_name;
  146. if (empty($instances[$instance_name])) {
  147. if (empty($dsn) && defined('DB_DSN')) {
  148. $dsn = DB_DSN;
  149. }
  150. //$instances[$instance_name] = new SqlDb($dsn);
  151. $db = App::getData('app')->get('db');
  152. $instances[$instance_name] = $db($dsn);
  153. }
  154. return $instances[$instance_name];
  155. }
  156. }