Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MVC + Context] Jak to połączyć?
starach
post 5.12.2008, 13:52:12
Post #1





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Mize
post 5.12.2008, 18:36:58
Post #2





Grupa: Zarejestrowani
Postów: 84
Pomógł: 6
Dołączył: 26.03.2008
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Mize 7.12.2008, 15:58:10


--------------------
NULL;
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.06.2025 - 00:30