Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MVC + Context] Jak to połączyć?
Forum PHP.pl > Forum > PHP > Object-oriented programming
starach
No dobra przekonaliście mnie co do słuszności stosowania kontekstu. ( Temat: PDO_i_wspolpraca_z_wlasnymi_klasami )
Tylko jak go połączyć z ładowarką modułów. Przykładowy moduł Artykuły:
Kod
- Control
| - Category
  | - Edit.php
  | - List.php
  | - View.php
| - Article
  | - Edit.php
  | - List.php
  | - View.php
// Każdy controler to oddzielna podstrona.
// Jeśli bym chciał potwierdzać edycję, wsadziłbym Edit.php do folderu i dodał plik Confirm.php
- Model
| - ORM ( Propel )
| - Category
  | - [Control/Category/]
| - Article
  | - [Control/Article/]
| - Config
  | - Config.php
  | - settings.php <- Trzymam ustawienia modułu.
- View
| - RSS.php
| - Default.php
Klasa silnika Loader, ładuje mi konkretny kontroler. Następnie Model i na końcu widok, którego nazwa jest zwrócona przez kontroler. Loader sam rozróżnia którą klasę załadować poprzez dostęp do Router'a. Obecnie Loader pobiera biblioteki poprzez Instance::Get('module.article.control.list' [etc.] ), który jest połączeniem rejestru z abstract factory.

Dzięki temu każda wtyczka / dodatek może wykorzystać już załadowany kontroler, model lub widok, a nawet pobrać i wykonać inny.
Przykładowo jesteśmy na stronie z konkretnym artykułem, a wtyczka pobiera nam listę artykułów i wyświetla wynik w panelu bocznym.

No i teraz moje pytanie. Jak mam wpasować tutaj kontekst?
Mize
U mnie wszystkie rdzenne komponenty fw, dziedziczą po klasie dfCore. Dla 'innych' mam interfejs z dwoma metodami.
Wszystkie klasy ładuje obiektem dfLoader, który automatycznie robi taki 'myk'.

  1. <?php
  2.  
  3.            /*
  4.             *
  5.             * Loads class.
  6.             * @param: $sClass; @type: string; @desc: class name;
  7.             * @param: $bCreateInstance; @type: boolean; @desc: is there need to create instance?;
  8.             * @param: $bSetContext, @type: boolean; @desc: is there need to set context?;
  9.             *
  10.             */
  11.            
  12.            public function loadClass($sClass, $bCreateInstance = true, $bSetContext = true) {
  13.    
  14.                if( !$this->isLoaded($sClass) ) {
  15.            
  16.                if( file_exists( LIB_PATH . $sClass . '/Class.php' ) ) {
  17.                
  18.                    require( LIB_PATH . $sClass . '/Class.php' );
  19.                    
  20.                    if( file_exists( LIB_PATH . $sClass . '/Exception.php' ) ) { $this->loadException($sClass); }
  21.                    if( file_exists( LIB_PATH . $sClass . '/Interface.php' ) ) { $this->loadInterface($sClass); }
  22.                    
  23.                    if($bCreateInstance) {
  24.                    
  25.                        $oClass = new $sClass;
  26.                        
  27.                        if( $bSetContext ) { $oClass->setContext($this->getContext()); }
  28.                        
  29.                        return $oClass;
  30.                    
  31.                    }
  32.                
  33.                } else { throw new dfException('Class not found!'); }
  34.                
  35.                } else { throw new dfException('Class has been already loaded!'); }
  36.            
  37.            }
  38. ?>


Szczerze, to nie wiem jak to lepiej rozwiązać...
Jest dość elastyczne, więc zawsze można przerobić.

I przykład zastosowania.

  1. <?php
  2. /* Zwroci obiekt dfRouter, z nadana referencja do kontekstu. */
  3.  
  4. $Router = $Loader->loadClass('dfRouter');
  5.  
  6. /* Zwroci obiekt dfRouter, bez referencji. */
  7.  
  8. $Router = $Loader->loadClass('dfRouter', true, false);
  9.  
  10. /* Po prostu załaduje klase, ale nie stworzy obiektu. Tak ładuje klasy abstrakcyjne. */
  11.  
  12. $Loader->loadClass('dfRouter', false);
  13.  
  14. ?>


Pozdrawiam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.