Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ZendFramework] modele w aplikacji z modułami
Daimos
post
Post #1





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


Witam
Ciekawi mnie jakie Wy macie rozwiązania na modele w aplikacjach z modułami.
Kiedy ustawimy sobie moduły, autoloader automatycznie nam dopisuje ścieżkę do modeli "zbiorczych", które są w katalogu głównym aplikacji, a teraz co z modelami, które mają być dedykowane dla danego modułu?
Czyli jak wywołać model, który będzie np. w katalogu:
Cytat
application/module/NAZWAJAKAS/models/ModelTestowy.php

Tam autoloader sam już nie wejdzie, trzeba sobie radzić. Niektórzy robią to dodając include_paths do każdego modułu, inni piszą plugin, który dodaje include_path oddzielnie dla każdego modułu, np:
  1. public function dispatchLoopStartup(Zend_Controller_Request_Abstract $req)
  2. {
  3. $moduleName = $req->getModuleName();
  4. PATH_SEPARATOR . APPLICATION_PATH . '/modules/' . $moduleName . '/models');
  5. }

Macie na to jakieś ciekawe rozwiązania?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
eai
post
Post #2





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

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


Nie musisz kopiować zawartości innych bootstrapów, są to dodatkowe bootstrapy z możliwością rejestracji specyficznych zasobów dla danego modułu. Dodatkowo możesz z głównego bootstrapa, dostać się do instancji obiektów tych klas. Zarejestrowany element plugin etc. jest widziany w całej aplikacji tak jakbyś rejestrował go w tym głównym bootstrapie. No i przede wszystkim z automatu rejestrują Ci przestrzeń nazw i możesz mieć oddzielne modele w poszczególnych modułach, te modele mogą też dziedziczyć po modelach wspólnych dla aplikacji (tzn. z application/models). Zarejestrowane przestrzenie widoczne są w całej aplikacji czyli we wszystkich modułach. Czyli będąc w kontrolerze modułu np. admin możesz wywołać model z modułu np. users. Nie wiem czemu nie przekonuje Cię to rozwiązanie, przecież 20 pustych plików Bootstrap.php to nic złego, a czasami może je wykorzystasz do rejestracji jakiegoś zasobu na potrzeby danego modułu.


No dobra ale wracając do problemu, to przede wszystkim zrób to dobrze. Plugin to także złe miejsce do tego, bo przecież plugin uruchamiany jest po rozruchu aplikacji (po wykonaniu procesów bootstrapa) Nie dodawaj tego do include_path bo to nie twoja działka, takie sprawy zostaw Frameworkow'i. W Zend Framework jest od takich spraw Zend_Loader a w twoim przypadku jest specjalna klasa do tego Zend_Application_Module_Autoloader.

A więc rozwiązaniem twojego problemu będzie taki o to główny Bootstrap.
  1. <?php
  2.  
  3. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  4. {
  5. /**
  6.   * Inicjowanie przestrzeni nazw dla wszystkich modułów
  7.   *
  8.   * @return void
  9.   */
  10. protected function _initModulesNamespace()
  11. {
  12.  
  13. $modulesDir = APPLICATION_PATH . DIRECTORY_SEPARATOR . 'modules';
  14.  
  15. if(file_exists($modulesDir) && is_dir($modulesDir)) {
  16. // Zawartosc katalogu
  17. $modules = scandir($modulesDir);
  18.  
  19. // Usuwamy dwa pierwsze elementy, ponieważ to katalog nadrzędny i bierzący
  20. $modules = array_slice($modules,2);
  21. foreach($modules as $file) {
  22. // Sprawdzamy czy plik jest katalogiem i czy nie zaczyna się od "." np: .svn
  23. if(is_dir($modulesDir . DIRECTORY_SEPARATOR . $file) && substr($file, 0, 1) != '.') {
  24. // Rejestrujemy przestrzenie
  25. $autoloader = new Zend_Application_Module_Autoloader(array(
  26. 'namespace' => ucfirst(strtolower($file)),
  27. 'basePath' => $modulesDir. DIRECTORY_SEPARATOR . $file,
  28. // Rejestrujemy przestrzeń dla modeli
  29. 'model' => array ('path' => 'models/', 'namespace' => 'Model'),
  30.  
  31. // ... nie wiem może zechcesz zarejestrować też Formularze
  32. 'form' => array ('path' => 'forms/', 'namespace' => 'Form')
  33. // .. itd...
  34. ));
  35. }
  36. }
  37.  
  38. }
  39. }
  40. }



pisałem z palca więc może coś trzeba poprawić. Ale generalnie powinno latać (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 9.10.2025 - 13:46