diff --git a/.github/workflows/phpstan.yaml b/.github/workflows/phpstan.yaml index 8d90800544..33ae8115d0 100644 --- a/.github/workflows/phpstan.yaml +++ b/.github/workflows/phpstan.yaml @@ -18,7 +18,11 @@ jobs: php-version: 7.4 - name: Install Dependencies - run: composer update --ignore-platform-reqs + run: | + # copy common.config.php for composer autoloader + cp core/config/common.config.sample.php core/config/common.config.php + # install composer dependencies + composer update --ignore-platform-reqs - name: Setup PHP 8.2 for PHPStan uses: shivammathur/setup-php@v2 diff --git a/composer.json b/composer.json index 25d7fc3830..ff9d7e7539 100644 --- a/composer.json +++ b/composer.json @@ -15,5 +15,21 @@ "platform": { "php": "7.4" } + }, + "autoload": { + "psr-4": { + "Jeedom\\Core\\": "src/", + "Jeedom\\Plugins\\": "plugins/" + }, + "files": [ + "core/config/common.config.php", + "core/php/utils.inc.php", + "core/config/compatibility.config.php" + ], + "classmap": [ + "core/class/", + "core/com/", + "core/repo/" + ] } } diff --git a/core/class/log.class.php b/core/class/log.class.php index 4660c278ff..17612b912a 100644 --- a/core/class/log.class.php +++ b/core/class/log.class.php @@ -59,7 +59,11 @@ public function log($level, $message, array $context = array()) { public static function getConfig($_key, $_default = '') { if (self::$config === null) { - self::$config = array_merge(config::getLogLevelPlugin(), config::byKeys(array('log::engine', 'log::formatter', 'log::level', 'addMessageForErrorLog', 'maxLineLog'))); + try { + self::$config = array_merge(config::getLogLevelPlugin(), config::byKeys(array('log::engine', 'log::formatter', 'log::level', 'addMessageForErrorLog', 'maxLineLog'))); + } catch (Exception $e) { + self::$config = array(); + } } if (isset(self::$config[$_key])) { return self::$config[$_key]; diff --git a/core/class/translate.class.php b/core/class/translate.class.php index 50aebb72ef..b84c1178b8 100644 --- a/core/class/translate.class.php +++ b/core/class/translate.class.php @@ -215,7 +215,3 @@ public static function setLanguage($_langage) { /* * *********************Methode d'instance************************* */ } - -function __($_content, $_name, $_backslash = false) { - return translate::sentence(str_replace("\'", "'", $_content), $_name, $_backslash); -} diff --git a/core/class/update.class.php b/core/class/update.class.php index c2b5062355..88b0cb8076 100644 --- a/core/class/update.class.php +++ b/core/class/update.class.php @@ -360,6 +360,9 @@ public function doUpdate() { if (file_exists($cibDir)) { rrmdir($cibDir); } + // re generate composer autoloader + $result = shell_exec(system::getCmdSudo() . ' composer dump-autoload --optimize --working-dir $WEBSERVER_HOME'); + log::add(__CLASS__, 'debug', "Composer autoloader dump result:\n$result"); } else { throw new Exception(__("Impossible de décompresser l'archive zip", __FILE__) . ' : ' . $tmp . ' => ' . ZipErrorMessage($res)); } diff --git a/core/php/core.inc.php b/core/php/core.inc.php index 2502e1ea54..3f55fb2d3a 100644 --- a/core/php/core.inc.php +++ b/core/php/core.inc.php @@ -17,64 +17,49 @@ */ date_default_timezone_set('Europe/Brussels'); require_once __DIR__ . '/../../vendor/autoload.php'; -require_once __DIR__ . '/../config/common.config.php'; -require_once __DIR__ . '/../class/DB.class.php'; -require_once __DIR__ . '/../class/config.class.php'; -require_once __DIR__ . '/../class/jeedom.class.php'; -require_once __DIR__ . '/../class/plugin.class.php'; -require_once __DIR__ . '/../class/translate.class.php'; -require_once __DIR__ . '/utils.inc.php'; include_file('core', 'jeedom', 'config'); -include_file('core', 'compatibility', 'config'); -include_file('core', 'utils', 'class'); -include_file('core', 'log', 'class'); try { $configs = config::byKeys(array('timezone', 'log::level')); if (isset($configs['timezone'])) { date_default_timezone_set($configs['timezone']); } -} catch (Exception $e) { -} catch (Error $e) { +} catch (Throwable $e) { + log::add('jeedom', 'error', 'Log (level|timezone) configuration failed: ' . $e->getMessage()); } try { if (isset($configs['log::level'])) { log::define_error_reporting($configs['log::level']); } -} catch (Exception $e) { -} catch (Error $e) { +} catch (Throwable $e) { + log::add('jeedom', 'error', 'Log (level|timezone) configuration failed: ' . $e->getMessage()); } +/** + * Autoload function for specific Jeedom classes + * this function is called after the default Composer autoloader + * it will load specific classes such as Cmd, Real, etc. + * for plugins that do not use namespaces or Composer autoloading + */ function jeedomAutoload($_classname) { - /* core class always in /core/class : */ - $path = __DIR__ . "/../../core/class/$_classname.class.php"; - if (file_exists($path)) { - include_file('core', $_classname, 'class'); - } else if (substr($_classname, 0, 4) === 'com_') { - /* class com_$1 in /core/com/$1.com.php */ - include_file('core', substr($_classname, 4), 'com'); - } else if (substr($_classname, 0, 5) === 'repo_') { - /* class repo_$1 in /core/repo/$1.repo.php */ - include_file('core', substr($_classname, 5), 'repo'); - } else if (strpos($_classname, '\\') === false && strpos($_classname, '/') === false) { - /* autoload for plugins : no namespace */ - $classname = str_replace(array('Real', 'Cmd'), '', $_classname); + if (strpos($_classname, '\\') !== false || strpos($_classname, '/') !== false) { + return; + } + /* autoload for plugins : no namespace */ + $classname = str_replace(array('Real', 'Cmd'), '', $_classname); + $plugin_active = config::byKey('active', $classname, null); + if (($plugin_active === null || $plugin_active == '' || $plugin_active == 0) && strpos($classname, '_') !== false) { + $classname = explode('_', $classname)[0]; $plugin_active = config::byKey('active', $classname, null); - if (($plugin_active === null || $plugin_active == '' || $plugin_active == 0) && strpos($classname, '_') !== false) { - $classname = explode('_', $classname)[0]; - $plugin_active = config::byKey('active', $classname, null); - } - if ($plugin_active == 1) { - try { - include_file('core', $classname, 'class', $classname); - } catch (Exception $e) { - - } catch (Error $e) { - - } + } + if ($plugin_active == 1) { + try { + include_file('core', $classname, 'class', $classname); + } catch (Throwable $e) { + log::add('jeedom', 'error', 'Log (level|timezone) configuration failed: ' . $e->getMessage()); } } } -spl_autoload_register('jeedomAutoload', true, true); +spl_autoload_register('jeedomAutoload'); diff --git a/core/php/utils.inc.php b/core/php/utils.inc.php index 08b0613c92..5e33d19fa5 100644 --- a/core/php/utils.inc.php +++ b/core/php/utils.inc.php @@ -1839,3 +1839,10 @@ function implode_recursive($_array, $_separator, $_key = '') { } return $result; } + +/** + * alias for translate::sentence + */ +function __($_content, $_name, $_backslash = false) { + return translate::sentence(str_replace("\'", "'", $_content), $_name, $_backslash); +}