diff --git a/.github/workflows/phpstan.yaml b/.github/workflows/phpstan.yaml index 0f698e7ad8..64549fc17e 100644 --- a/.github/workflows/phpstan.yaml +++ b/.github/workflows/phpstan.yaml @@ -25,7 +25,11 @@ jobs: php-version: ${{ matrix.php }} - 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: Restore PHPStan cache id: cache-phpstan diff --git a/composer.json b/composer.json index 8bd5350b62..fe71d5d025 100644 --- a/composer.json +++ b/composer.json @@ -17,6 +17,22 @@ "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/" + ] + }, "require-dev": { "phpstan/phpstan": "^2.1" } diff --git a/core/class/log.class.php b/core/class/log.class.php index b63bac7267..041aa458c5 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', 'maxSizeLog'))); + try { + self::$config = array_merge(config::getLogLevelPlugin(), config::byKeys(array('log::engine', 'log::formatter', 'log::level', 'addMessageForErrorLog', 'maxLineLog', 'maxSizeLog'))); + } catch (Exception $e) { + self::$config = array(); + } } if (isset(self::$config[$_key])) { return self::$config[$_key]; diff --git a/core/class/update.class.php b/core/class/update.class.php index ffbde4fb6f..9525a8467e 100644 --- a/core/class/update.class.php +++ b/core/class/update.class.php @@ -357,6 +357,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 1435d63370..4572f05725 100644 --- a/core/php/core.inc.php +++ b/core/php/core.inc.php @@ -17,17 +17,7 @@ */ 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')); @@ -35,6 +25,7 @@ date_default_timezone_set($configs['timezone']); } } catch (\Throwable $e) { + log::add('jeedom', 'error', 'Log (level|timezone) configuration failed: ' . $e->getMessage()); } try { @@ -42,35 +33,35 @@ log::define_error_reporting($configs['log::level']); } } 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 (Throwable $e) { - log::add('plugin', 'error', $e->getMessage()); - } + } + if ($plugin_active == 1) { + try { + include_file('core', $classname, 'class', $classname); + } catch (\Throwable $e) { + log::add('plugin', 'error', $e->getMessage()); } } } -spl_autoload_register('jeedomAutoload', true, true); +// Composer's autoloader (registered via vendor/autoload.php above) runs first. +// jeedomAutoload is a fallback for legacy plugin classes without namespace. +spl_autoload_register('jeedomAutoload'); diff --git a/core/php/utils.inc.php b/core/php/utils.inc.php index ae64c5921b..9b161cf8f4 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); +}