Impossible de charger le namespace Joomla\CMS\Factory sous PHP 8.2 / Joomla 5.3.0

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [RÉGLÉ] Impossible de charger le namespace Joomla\CMS\Factory sous PHP 8.2 / Joomla 5.3.0

    Bonjour à tous,

    Je suis en pleine migration d’un script PHP placé à la racine du site vers Joomla 5.3.0 sur un serveur PHP 8.2, et je bute sur un problème persistant :

    L’appel​ :

    Code PHP:
    Factory::getApplication('site')->initialise(); 

    génère systématiquement l’exception :

    Code:
    Failed to start application
    at Joomla\CMS\Factory::getApplication()
    • J’ai activé l’affichage des erreurs, vérifié que JPATH_BASE pointe bien vers la racine de l’installation et même tenté de charger manuellement le fichier vendor/autoload.php, mais la classe Joomla\CMS\Factory reste introuvable.
    • J’ai trouvé des sources proposant de déclarer le namespace Factory avant de définir _JEXEC, ce qui aurait apparemment corrigé le problème pour certains, mais sans effet chez moi.

    Voici le script que j’utilise actuellement (placé à la racine du site) :

    Code PHP:
    <?php

    require_once 'fpdf.php';
    include_once 
    'connexion_db.php';

    try {
        
    // 1) Définissez JPATH_BASE si ce n'est pas déjà fait
        
    define('JPATH_BASE''/XXX');

        
    // 2) Enregistrez un autoloader PSR-4 pour Joomla\CMS
        
    spl_autoload_register(function($class){
            
    $prefix   'Joomla\\CMS\\';
            
    $baseDir  JPATH_BASE '/libraries/src/';
            
    $len      strlen($prefix);

            
    // Si la classe n’appartient pas à Joomla\CMS, on passe
            
    if (strncmp($prefix$class$len) !== 0) {
                return;
            }

            
    // Raccourci : transforme Joomla\CMS\Foo\Bar en Foo/Bar.php
            
    $relativeClass substr($class$len);
            
    $file $baseDir str_replace('\\''/'$relativeClass) . '.php';

            if (
    file_exists($file)) {
                require_once 
    $file;
            }
        });

        
    /* LE PROBLEME SE SITUE A LA DECLARATION DE CE NAMESPACE */
        // 3) Maintenant vous pouvez
        
    use Joomla\CMS\Factory;

        
    // Récupère l’instance de l’application (site ou administrator)
        
    $app Factory::getApplication();

        
    // Récupère l’objet UserIdentity
        
    $identity $app->getIdentity();

        
    // Test de récupération de l'utilisateur connecté
        // Si l’ID de l’utilisateur est > 0, c’est qu’il est connecté
        
    if ($identity->getId() > 0) {
            
    // Utilisateur connecté
            
    echo 'Bonjour ' $identity->getUser()->get('name');
            die();
        } else {
            
    // Visiteur anonyme
            
    echo 'Vous n’êtes pas connecté';
            die();
        }
    } catch (
    \Throwable $e) {
        
    // Tout problème dans le bootstrap sera affiché ici
        
    echo '<h1>Erreur durant le bootstrap de Joomla</h1>';
        echo 
    '<pre>' $e '</pre>';
        exit;
    }

    /**
     * Initialise l'environnement Joomla
     */
    function initializeJoomla() {
        
    define('_JEXEC'1);
        
    define('DS''/');
        
    //define('JPATH_BASE', $_SERVER['DOCUMENT_ROOT']);
        
    require_once(JPATH_BASE DS 'includes' DS 'defines.php');
        require_once(
    JPATH_BASE DS 'includes' DS 'framework.php');

        
    // Instantiate the application.
        
    $container \Joomla\CMS\Factory::getContainer();

        
    $container->alias('session.web''session.web.site')
            ->
    alias('session''session.web.site')
            ->
    alias('JSession''session.web.site')
            ->
    alias(\Joomla\CMS\Session\Session::class, 'session.web.site')
            ->
    alias(\Joomla\Session\Session::class, 'session.web.site')
            ->
    alias(\Joomla\Session\SessionInterface::class, 'session.web.site');

        
    $app $container->get(\Joomla\CMS\Application\SiteApplication::class);

        
    jimport('joomla.user.user');
        
    jimport('joomla.session.session');
        
    jimport('joomla.user.authentication');
    }

    initializeJoomla();

    Questions :

    L’autoloader PSR-4 de Joomla 5.3.0 a-t-il changé de configuration ?

    Y a-t-il un ordre d’initialisation ou une astuce sous PHP 8.2 pour que Joomla\CMS\Factory soit bien résolu ?

    Avez-vous déjà rencontré ce “White Screen of Death” lié à Factory non chargé, et quelle solution a fonctionné pour vous ?

    Merci beaucoup pour vos retours ! Toute piste de debug ou fragment de configuration sera précieux.

    Bonne journée !
    — Un développeur motivé, mais un peu perdu.
    Dernière édition par zyltar à 08/05/2025, 15h09

  • #2
    Tu ne charges pas les fonctions nécessaires. Soit tu utilise au début de ton script use joomla/cms/factory , soit tu utilise une seconde syntaxe que tu teouveras sur le site de la doc.
    pour moi tu ne devrais pas utiliser un autoloader dans ton script.... tous les autoloader que j ai vu sont des plugins.. ton tu créés un plugins avec ton autoloader et ensuite tu pourras utiliser ce qui te manques..
    Dernière édition par lefabdu51 à 09/05/2025, 11h52

    Commentaire


    • #3
      Bonjour,

      Merci encore pour votre aide. Pour récapituler :
      • Ce script, placé à la racine du site, fonctionnait parfaitement sous Joomla 4.
      • Avec Joomla 5.3.0 et PHP 8.2, j’ai supprimé entièrement l’autoloader manuel. Je m’appuie sur celui de Joomla (via defines.php / framework.php).​
      • J’ai placé en tête du script la ligne
      Code PHP:
      use Joomla\CMS\Factory
      • avant toute définition de _JEXEC.
      • J’ai vérifié plusieurs fois JPATH_BASE et la présence de configuration.php et includes/defines.php.
      • J’ai également tenté de charger vendor/autoload.php sans succès.

      Pourtant, à chaque appel de
      Code PHP:
      $app Factory::getApplication('site');
      $app->initialise(); 
      j’obtiens toujours cette exception au même endroit dans le cœur Joomla :
      Code PHP:
      /**
       * @throws  \Exception
       */
      public static function getApplication()
      {
          if (!
      self::$application) {
              throw new 
      \Exception('Failed to start application'500);
          }
          return 
      self::$application;
      }
      // libraries/src/Factory.php:158​ 
      Autrement dit, self::$application n’est jamais instancié, et le bootstrap « canonique » (configuration → defines → framework → Factory::getApplication('site') → initialise) n’a pas permis de résoudre ce problème.

      A noter : ce comportement n’existait pas avec Joomla 4, où le même code chargeait correctement l’application.
      J'ai également recherché toutes les pistes plausibles dans la doc liée à Factory, sans succès.

      Auriez-vous d’autres pistes ? Peut-être un réglage spécifique sous PHP 8.2 ou une configuration serveur qui empêche l’enregistrement PSR-4 de Joomla ? Merci d’avance pour tout indice supplémentaire !

      Code modifié :
      Code PHP:
      <?php
      // 1. Pour le développement : afficher toutes les erreurs (à retirer en prod)
      error_reporting(E_ALL);
      ini_set('display_errors'1);
      // 2. Charger FPDF et votre connexion métier
      require_once 'fpdf.php';
      include_once 
      'connexion_db.php';
      // 3. Importer le namespace Factory de Joomla
      use Joomla\CMS\Factory;
      // 4. Sécurité Joomla
      defined('_JEXEC') or define('_JEXEC'1);
      defined('DS')    or define('DS'DIRECTORY_SEPARATOR);
      // 5. Définir le chemin vers la racine de votre installation Joomla
      define('JPATH_BASE''/XXX');
      // 6. Bootstrap Joomla
      require_once JPATH_BASE DS 'configuration.php';
      require_once 
      JPATH_BASE DS 'includes' DS 'defines.php';
      require_once 
      JPATH_BASE DS 'includes' DS 'framework.php';
      // 7. Instancier et initialiser l’application Joomla
      $app Factory::getApplication('site');
      $app->initialise();
      // 8. Récupérer l’utilisateur connecté via l’Identity
      $identity $app->getIdentity();
      // 9. Tester la connexion
      if ($identity->getId() > 0) {
          
      // Utilisateur connecté
          
      echo 'Bonjour ' $identity->getUser()->get('name');
          exit;
      } else {
          
      // Invité
          
      echo 'Vous n’êtes pas connecté';
          exit;
      }
      // 10. … suite de logique avec l’export PDF …
      Bonne journée.​
      Dernière édition par zyltar à 13/05/2025, 11h03

      Commentaire


      • #4
        Salut
        Je ne sais pas si cela joue mais tu executes ce code sur une machine windows ou linux?

        Commentaire


        • #5
          Hello Wismer,

          En fait je travaille sur un espace de sandbox en ligne. Voici quelques informations sur celui-ci :

          Version Apache 2.4.62
          Version de MySQL 10.6.20-MariaDB-cll-lve
          Architecture x86_64
          Système d’exploitation linux

          Commentaire


          • #6
            Essayes avec ce debut de code.
            <?php

            // Chemin vers le fichier d'initialisation de Joomla
            define('_JEXEC', 1);
            define('JPATH_BASE', "."); // ou adapte si tempo.php est ailleurs
            require_once JPATH_BASE . '/includes/defines.php';
            require_once JPATH_BASE . '/includes/framework.php';

            use Joomla\CMS\Application\SiteApplication;
            use Joomla\CMS\Factory;
            use Joomla\CMS\User\User;
            use Joomla\CMS\User\UserHelper;
            // Créer manuellement l'application site
            $container = \Joomla\CMS\Factory::getContainer();
            $container->alias('session.web', 'session.web.site')
            ->alias('session', 'session.web.site')
            ->alias('JSession', 'session.web.site')
            ->alias(\Joomla\CMS\Session\Session::class, 'session.web.site')
            ->alias(\Joomla\Session\Session::class, 'session.web.site')
            ->alias(\Joomla\Session\SessionInterface::class, 'session.web.site');

            $app = $container->get(Joomla\CMS\Application\SiteApplication::cla ss );
            Factory::$application = $app;
            $user = Factory::getUser();
            var_dump($user);
            Je n'ai pas tout compris, mais le var_dump fonctionne.
            J'ai mis le fichier a la racine du site.
            Dernière édition par Wismer à 13/05/2025, 13h17
            zyltar aime ceci.

            Commentaire


            • #7
              Merci mille fois pour ton coup de main ! Grâce à ton astuce avec le container et Factory::$application, mon script tourne enfin sous Joomla 5/PHP 8.2 alors que j’étais complètement bloqué. Tu m’as vraiment sauvé la mise !

              Encore merci et bonne continuation !​

              Commentaire

              Annonce

              Réduire
              Aucune annonce pour le moment.

              Partenaire de l'association

              Réduire

              Hébergeur Web PlanetHoster
              Travaille ...
              X