GXCoreLoader überladen?

Thema wurde von Steffen (indiv-style.de), 5. Oktober 2020 erstellt.

  1. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.143
    Danke erhalten:
    1.466
    Danke vergeben:
    452
    Beruf:
    Systemadmin, Webentwickler bei Indiv-Style
    Ort:
    PhpStorm
    Ich möchte in der Class GXCoreLoader die Methoden getService und _getPersonalDataFactory erweitern.
    Zusätzlich wird für meine Erweiterung eine zusätzliche Methode benötigt. Erstelle ich in meinem Modul in GXModules im Ordner overloads meine Erweitungsklasse "class IS_GXCoreLoader extends IS_GXCoreLoader_parent" und erweitere die o.g. Methoden mit:
    PHP:
    case 'OfferObject':
                    
    $factory $this->_getOfferServiceFactory();
                  
                    return 
    $factory->createOfferObjectService();
                    break;
                case 
    'OfferRead':
                    
    $factory $this->_getOfferServiceFactory();
                  
                    return 
    $factory->createOfferReadService();
                    break;
                case 
    'OfferWrite':
                    
    $factory $this->_getOfferServiceFactory();
                  
                    return 
    $factory->createOfferWriteService();
                    break;
    bzw. mit:
    PHP:
    $this->getService('OfferRead'),
                                                                        
    $this->getService('OfferWrite'),
    hagelt es 500er Error. Er findet IS_GXCoreLoader_parent nicht...

    Ich habe nun notgedrungen einen eigenen Loader "StaticIS_GXCoreLoader" welcher nur meine Änderungen beinhaltet gebaut und eine weitere "class IS_GXCoreLoader" erstellt, welche von GXCoreLoader extendet.

    Funzt prima, jedoch stellt sich für mich die Frage wieso das mit den Overloading nicht funktioniert.

    Im modul spreche ich den Loader so an:

    PHP:
    /** @var offerWriteService */
    $this->offerWriteService StaticIS_GXCoreLoader::getService('OfferWrite');
    Zur Info:
    in "StaticIS_GXCoreLoader" sieht so aus:

    PHP:
    class StaticIS_GXCoreLoader
    {
        
    /**
         * GXCoreLoader Instance
         *
         * @var GXCoreLoaderInterface
         */
        
    protected static $IS_gxCoreLoader;
      
      
        
    /**
         * Class Constructor
         *
         * @throws BadFunctionCallException
         */
        
    public function __construct()
        {
            throw new 
    BadFunctionCallException('This class is for static use only.');
        }
      
      
        
    /**
         * Get a service object instance.
         *
         * @param string $serviceName
         *
         * @return object
         */
        
    public static function getService($serviceName)
        {
            
    $IS_gxCoreLoader self::_getGXCoreLoader();
            
    $service      $IS_gxCoreLoader->getService($serviceName);
          
            return 
    $service;
        }
      
      
        
    /**
         * Method depends on CodeIgniter database library.
         *
         * @return CI_DB_query_builder
         */
        
    public static function getDatabaseQueryBuilder()
        {
            
    $IS_gxCoreLoader         self::_getGXCoreLoader();
            
    $databaseQueryBuilder $IS_gxCoreLoader->getDatabaseQueryBuilder();
          
            return 
    $databaseQueryBuilder;
        }
      
      
        
    /**
         * Method depends on PHP DebugBar library.
         *
         * @return DebugBar
         */
        
    public static function getDebugBar()
        {
            
    $IS_gxCoreLoader     self::_getGXCoreLoader();
            
    $standardDebugBar $IS_gxCoreLoader->getDebugBar();
          
            return 
    $standardDebugBar;
        }
      
      
        
    /**
         * Method depends on PHP DebugBar library.
         *
         * @return array
         */
        
    public static function getDebugBarAssets()
        {
            
    $IS_gxCoreLoader   self::_getGXCoreLoader();
            
    $debugBarAssets $IS_gxCoreLoader->getDebugBarAssets();
          
            return 
    $debugBarAssets;
        }
      
      
        
    /**
         * Method depends on CodeIgniter database library.
         *
         * @return CI_DB_utility
         */
        
    public static function getDatabaseUtilityHelper()
        {
            
    $IS_gxCoreLoader          self::_getGXCoreLoader();
            
    $databaseUtilityHelper $IS_gxCoreLoader->getDatabaseUtilityHelper();
          
            return 
    $databaseUtilityHelper;
        }
      
      
        
    /**
         * Method depends on CodeIgniter database library.
         *
         * @return CI_DB_forge
         */
        
    public static function getDatabaseForgeHelper()
        {
            
    $IS_gxCoreLoader        self::_getGXCoreLoader();
            
    $databaseForgeHelper $IS_gxCoreLoader->getDatabaseForgeHelper();
          
            return 
    $databaseForgeHelper;
        }
      
      
        
    /**
         * Returns an instance of the ThemeControl.
         *
         * @return \ThemeControl
         */
        
    public static function getThemeControl()
        {
            
    $IS_gxCoreLoader self::_getGXCoreLoader();
            
    $themeControl $IS_gxCoreLoader->getThemeControl();
          
            return 
    $themeControl;
        }
      
      
        
    /**
         * Get GX Core Loader object instance.
         *
         * @return GXCoreLoaderInterface
         */
        
    protected static function _getGXCoreLoader()
        {
            if (
    self::$IS_gxCoreLoader === null) {
                
    /**
                 * If the MainFactory cache is not fully built, the creation of the GXCoreLoaderSettings and GXCoreLoader
                 * objects fails, because of interdependencies. Including the necessary files beforehand solves the problem.
                 */

                
    include_once DIR_FS_CATALOG 'GXModules/IndivStyle/IndivAngebot/Loaders/IS_GXCoreLoader/IS_GXCoreLoader.inc.php';
              
                
    $IS_gxCoreLoaderSettings MainFactory::create('GXCoreLoaderSettings');
                
    self::$IS_gxCoreLoader   MainFactory::create('IS_GXCoreLoader'$IS_gxCoreLoaderSettings);
            }
          
            return 
    self::$IS_gxCoreLoader;
        }
    }
    Die "IS_GXCoreLoader" sieht so aus:

    PHP:
    class IS_GXCoreLoader extends GXCoreLoader
    {
        public function 
    getService($serviceName)
        {
          
            switch(
    $serviceName)
            {
                case 
    'OfferObject':
                    
    $factory $this->_getOfferServiceFactory();
                  
                    return 
    $factory->createOfferObjectService();
                    break;
                case 
    'OfferRead':
                    
    $factory $this->_getOfferServiceFactory();
                  
                    return 
    $factory->createOfferReadService();
                    break;
                case 
    'OfferWrite':
                    
    $factory $this->_getOfferServiceFactory();
                  
                    return 
    $factory->createOfferWriteService();
                    break;
            }
        }
      
        
    /**
         * Get an offer service factory object.
         *
         * @return AbstractOfferServiceFactory
         */
        
    protected function _getOfferServiceFactory()
        {
            if (
    $this->offerServiceFactory === null) {
                
    $db                        $this->getDatabaseQueryBuilder();
                
    $this->offerServiceFactory MainFactory::create('OfferServiceFactory'$db);
            }
          
            return 
    $this->offerServiceFactory;
        }
      
        function 
    _getPersonalDataFactory()
        {
            
    //parent::_getPersonalDataFactory();
          
            
    if (null === $this->personalDataServiceFactory) {
                
    $this->personalDataServiceFactory MainFactory::create('PersonalDataServiceFactory',
                                                                        
    $this->getService('OfferRead'),
                                                                        
    $this->getService('OfferWrite')
                                                                        );
            }

            return 
    $this->personalDataServiceFactory;
        }
    }
     
  2. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.662
    Danke erhalten:
    1.262
    Danke vergeben:
    300
    @Steffen (indiv-style.de) Das Überladen der Core Klasse wie den GXCoreLoader ist leider nicht möglich. Das Erstellen des eigenen CoreLoaders ist daher der richtige Weg. Da dein eigener Loader aber auch im /GXModules/ liegen kann, solle da ja eigentlich kein größers Problem sein.
     
  3. Steffen (indiv-style.de)

    Steffen (indiv-style.de) G-WARD 2013/14/15/16

    Registriert seit:
    30. Juni 2011
    Beiträge:
    5.143
    Danke erhalten:
    1.466
    Danke vergeben:
    452
    Beruf:
    Systemadmin, Webentwickler bei Indiv-Style
    Ort:
    PhpStorm
    Danke für die Rückmeldung.
    Das mit dem eigenen Loader ist kein Problem. Er liegt im Ordner GXModules/IndivStyle/MMeinModul/Loader/ und funktioniert perfekt. Ich hatte nur eben das Problem mit dem überladen. Das dies nun nicht geht und ich den richtigen Weg gefunden habe, ist alles gut. :):):)