Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: silnik framworka a helpersy aplikacji
Forum PHP.pl > Forum > PHP > Object-oriented programming
Black-Berry
W oprogramowaniu mam podział na engine oraz aplication (mam nadzieję że to dobry pomysł). W pewnym momencie żeby wyświetlić artykuł musze mieć takie coś:

  1. <?php
  2. //To jest mój główny plik inicjalizujący aplikację...
  3. $articleManager = new Article_Manager($context);
  4. ?>


  1. <?php
  2. //W innej części tworzę funkcję pomocniczą...
  3. function edcShowArticle($id)
  4. {
  5. global articleManager;
  6. $article = $articleManager->getArticle($id);
  7. $article->print();
  8. }
  9. ?>


Z mojego punktu widzenia nie można pozbyć się globalsów. Czy coś przeoczyłem bo zasada o nie-stosowaniu globalsów się miesza smile.gif
wookieb
Możesz stosować singletona. Najlepsze rozwiązanie.
Black-Berry
ale wewnątrz zwykłej funkcji? będzie tam widoczny?
wookieb
Singleton jest "widoczny" wszędzie. Zobacz o co w nim chodzi i wtedy bedziesz kumał.
Jezeli masz grupę funkcji w której potrzebuje ZMIENNE z zasiegu globalnego a nie EGZEMPLARZ KLASY to pogrupuj je w klasy albo stosuj do przechowywania tych zmiennych inne klasy.
Np u mnie nie ma żadnych globalsów ale jest pare funkcji jednakze sluza one tylko do manipulacji danych z argumentów.
LBO
Cytat(Black-Berry @ 4.09.2008, 08:38:22 ) *
  1. <?php
  2. //W innej części tworzę funkcję pomocniczą...
  3. function edcShowArticle($id)
  4. {
  5. global articleManager;
  6. $article = $articleManager->getArticle($id);
  7. $article->print();
  8. }
  9. ?>


Z mojego punktu widzenia nie można pozbyć się globalsów. Czy coś przeoczyłem bo zasada o nie-stosowaniu globalsów się miesza smile.gif


Dependency Injection, korzystaj z obiektowych rozwiazań i wzorców:

  1. <?php
  2. $articleManager = new AricleManager();
  3. $applicationManager->execute($articleManager);
  4. ?>


To jest bardzo powierzchowny przykład, ale przez takie przekazywanie obiektów, nie będziesz potrzebował globalsów.
Black-Berry
Widzę, ze nie wyraziłem się jasno worriedsmiley.gif Chodzi mi o funkcje pomocze. Takie które maskują bloki kodu obiektowego. Zależy mi na tym aby użytkownik ostateczny nie musiał używać obiektów tylko proste funkcje takie jak np edcBodydrop(), edcLayoutArea('left_menu'), edcLayutArea('top_menu'), edcLayoutArea('footer'); Nie będzie ich dużo. Mniej więcej 20-30. Są po to zeby kts od razu miał listing 30 funkcji które używa w templatce. Dzięki temu mogę rozgraniczyć pracę jaką ma wyknać zaawansowany programista, a ktoś kto poprostu ustawia sobie szablon strony.
wookieb
No to ci PRZECIEZ MOWIE. SINGLETON
Black-Berry
ale jak sadsmiley02.gif nie krzycz na mnie...
wookieb
google.pl -> singleton php .Czy to takie trudne? A nie bede ci tutaj pisal co i jak bo w necie znajdziesz bardziej szczegółowe info.
Black-Berry
dowiedziałem sie od koleg ze singletony są widoczne wszędzie jak globalsy. Ciekawe haha.gif. Klasy statyczne też ? Bo ponoć singletony wychodzą z uzycia? To bym mógł zamiast nich klasy statyczne stosować.
LBO
Cytat(wookieb @ 4.09.2008, 12:00:46 ) *
google.pl -> singleton php .Czy to takie trudne? A nie bede ci tutaj pisal co i jak bo w necie znajdziesz bardziej szczegółowe info.


@wookieb, spokojnie - wyjaśnij koledze o co dokładnie Tobie chodzi, bo to co piszesz, to nie jest rozwiązanie jego problemu. Kolega chce zwyczajnie uzywać fukcji zamiast obiektów. A Singleton to obiekt.

Black-Berry. takie funckje w szablonie, które używają obiektów pobierających dane to nie jest najlepszy pomysł.
Powinieneś pobrać te dane wcześniej i udostepnić w szablonie (tam dopiero przetwarzać). Helpery, hmmmm, powinny tylko manipulować na argumentach jakie dostały i niektórych częściach systemu, ale nie tak dynamicznych rzeczach jak AticleManager.
dr_bonzo
W templatkach piszesz:

  1. <?php echo $helper->edcLayoutArea('left_menu'); ?>


$helper jest PRAWIE-globalsem w templatce, includujesz plik z templatka w jakiejs tam funkcji

  1. <?php
  2. private function loadTemplate($templateName)
  3. {
  4.  
  5. $helper = new Helper( $this ); // dostep do kontrolera, sesji, itp
  6. include $templateName; // jak pisze w manualu, $helper bedzie dostepny w templatce
  7.  
  8. }
  9. ?>


http://pl.php.net/include/ :
Cytat
When a file is included, the code it contains inherits the variable scope of the line on which the include occurs. Any variables available at that line in the calling file will be available within the called file, from that point forward.


Dzieki temu masz dostep do funkcji w templatce, nie uzywasz globalsow, singletonow, no i masz polaczenie z requestem/sesja/kontrolerem
Cysiaczek
Znów SF i znów i18n, ale tym razem poglądowo smile.gif
http://trac.symfony-project.org/browser/br.../I18NHelper.php

Pozdrawiam.
Black-Berry
O rety blinksmiley.gif jakies podwójne podkreślniki zamiast funkcji... Chyba będzie lepiej jak zacznę czytać ksiazki czarodziej.gif

Dzieki za pooc ale nie potrafię z niej skorzystać smile.gif
LBO
Cytat(Black-Berry @ 5.09.2008, 14:32:14 ) *
O rety blinksmiley.gif jakies podwójne podkreślniki zamiast funkcji... Chyba będzie lepiej jak zacznę czytać ksiazki czarodziej.gif

Dzieki za pooc ale nie potrafię z niej skorzystać smile.gif


Przykład z SF pokazuje jak korzystać z funkcji, które wgryzają się w system nie poprzez parametry, a poprzez np. singletona z contextem.

Nadal (jak pamiętasz) uważam, że to kiepski pomysł. Chciałem zaproponować klasy statyczne (pamietasz mój przykład z innego topicu?) i chyba to zrobię.

  1. <?php
  2. // bardzo prosty koncepcyjnie przykład, ale teoretycznie powinien działać od ręki.
  3.  
  4. class Context {
  5. // to o czym rozmawialiśmy już kiedyś
  6.  
  7. // getDatabaseManager()
  8. // setDatabaseManager(DatabaseManager $database)
  9.  
  10. // getRoutingManager()
  11. // setRoutingManager(RoutingManager $routing)
  12.  
  13. // getInternationalisationManager()
  14. // setInternationalisationManager(InternationalisationManager $internationalisation)
  15.  
  16. // etc
  17. }
  18.  
  19. abstract class Helper {
  20. protected static $context;
  21.  
  22. public static function initialize(Context $context) // PAMIĘTAJ!
  23. {
  24. self::$context = $context;
  25. }
  26. }
  27.  
  28. class InternationalisationHelper extends Helper
  29. {
  30. public static function translate($text)
  31. {
  32. return self::$context->getInternationalisationManager()->translate($text);
  33. }
  34. }
  35.  
  36. // Musisz zadbać, by gdzieś przy starcie systemu, przekazywał on kontekst do klasy
  37. Helper
  38. // Dzieki temu wszystkie inne helpery będą miały do niego dostęp.
  39.  
  40. // Samo użcie banalne
  41. print InternationalisationHelper::translate('Hello world');
  42. // mozesz oczywiście ukrócić nazwy, ale jak widzisz,, feel przypadku uzycia identy
  43. zny prawie jak czystą funkcją
  44.  
  45. // ..i...
  46.  
  47. print HtmlHelper::escape('<h1>Hello World</h1>');
  48.  
  49. // ...i...
  50.  
  51. // http://framework.zend.com/manual/en/zend.controller.actionhelpers.html#zend.controller.actionhelpers.flashmessenger
  52.  
  53. print FlashMessage::read('error');
  54. // uzywa sesji, do której mozesz sie dostac poprzez np. self::$context->getSessionManager()
  55. ?>
Black-Berry
Wow. Dzięki. Jeszcze się w to wgryzam ale chyba zajmie mi to trochę. Ile ty już siedzisz nas swoim frameworkiem ?
LBO
Korzystam z Agavi.
Tam jest zupełnie inne podejście do helperów... których zwyczajnie w szablonie nie ma. Ale to ze względu na specyficzna budowę V w MVC.
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.