Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MVC] foldery => mod => class view
Forum PHP.pl > Forum > PHP > Object-oriented programming
KotWButach
Witam chciałem spytać mądrzejszych od siebie o poniższe.
Otóż tak.
Mam foldery, w tym mod/login , mod/news itd jeżeli chodzi o moduły.

  1.  
  2. - MODEL
  3. - VIEW
  4. - CONTROLLER
  5. - index.php
  6. - LIBS (Bootstrap.php, View)
  7. - MOD (LOGIN(MVC), NEWS(MVC)
  8.  


Czy taka struktura jest odpowiednia gdzie w MODUŁACH jest MVC i tam też znajduje się css, html dla danego modułu.

Problem jak załadować vidok... Czy utworzyć do tego helpera w LIBS view_mod.php czy też modyfikować klasę view?

Potrzebne mi to do pracy na uczelnii.
pamil
Całość nei jest zgodna z konwencją nazewnictwa PSR-0, więc nie powiedziałbym, że struktura jest odpowiednia.
Generalnie nic więcej powiedzieć nie mogę, po samej strukturze mało co się można dowiedzieć.
I nie "vidok" tylko "widok" (i uprzedzę - "classa"=>"klasa", "controllera"=>"kontrolera").
Spawnm
Tak w modułach możesz dać na nowo całe mvc, tak robi np. yii framework.
Co robi Bootstrap.php w libs?
KotWButach
Bootstrap to klasa wywoływana jest oczywiście w index.

------------------------------------------------------------------------

Witam
szukam o PSR-0 ale żadnych przykładów jest tylko opis który jest niejasny sad.gif czy ktoś mógł by podać jakieś linki do przykładowych implementacji PSR?
Crozin
1. Przecież dwa pierwsze linki w Google po wpisaniu PSR-0 dają kompletną odpowiedź.
2. MVC to tylko wzorzec architektoniczny, nie mający nic wspólnego ze strukturą katalogów, nazwą klasy czy innymi nieistotnymi bzdetami.
KotWButach
Czytałem ba nawet wczytywałem się po 10 razy w ANG i PL tekst i nie ogarniam tego w praktycznym zastosowaniu a bardzo bym chciał skoro jest to już standard a co dopiero mówić o psr1 czy 2.

To może sformułuje pytanie nieco inaczej jako że wciąz nie rozumiem związku struktury katalogów i PSR-0.

Jak powinna wyglądać struktura katalogów uwzględniając folder plugins (artykuły, logowanie, mail, statystyki itd...) model mvc oraz strefe publiczną.

Zastanawiam się też co powinno znajdować się w katalogu SYSTEM jeżeli takowy istnieje oraz APP jeżeli takowy istnieje a jeżeli istnieją oba?

Mam nadzieję że teraz zadałem bardziej właściwe pytania i pomożecie mi rozwiać moje wątpliwości.


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Hmm zaczytałem się w pewnym angielskim artykule i wywnioskowałem z niego że PSR-0 ma swoje odzwierciedlenie w katalogach przez pryzmat przestrzeni nazw i o to chodziło zapewne "pamilowi"

a wiec jeżeli mamy katalogi i przestrzenie nazw takie jak poniżej to znaczy że spelniam ten standard? Nie wiem jednak gdzie umieścic model i kontroler by było to czytelnie intuicyjnie i jak nazwać te foldery.

  1. -Config
  2. -App
  3. - Lib
  4. Bootstrap.php // namespace App\Classes (class name Bootstrap)
  5. Autoload.php // namespace App\Classes (class name Autoload)
  6. Auth.php // namespace App\Classes (class name Auth)
  7. [..]
  8. - Plugins
  9. - News
  10. listNews.php // namespace Plugins\News (class name listNews)
  11. [..]
  12. -[..]
  13. -Public
  14. - Img
  15. - View // gdzie umieścić model i kontroler (namespace Public\View) ?
  16. Index.php // namespace BaseFile


--------------------------------
co sądzicie o tym co on mówi robi?

http://www.youtube.com/watch?v=GBuJXovvdWE...nel&list=UL głownie part 2 czy to tak ma wygladać?

Dodam że zrobiłem coś takiego i nie wiem czy tak jest poprawnie bo pierwszy raz w tym stylu cokolwiek piszę.

  1. <?php
  2.  
  3. error_reporting(E_ALL ^ E_NOTICE);
  4. defined('BASEPATH') or define('BASEPATH', str_replace('\\', '/', dirname(realpath(__FILE__))) . '/');
  5. defined('PKGPATH') or define('PKGPATH', BASEPATH . 'Packages/');
  6. defined('APPPATH') or define('APPPATH', PKGPATH . 'App/');
  7. defined('COREPATH') or define('COREPATH', PKGPATH . 'Pulse/');
  8. defined('CONFIGPATH') or define('CONFIGPATH', PKGPATH . 'Config/');
  9.  
  10.  
  11.  
  12. if (!function_exists('bootstrap_autoloader'))
  13. {
  14.  
  15. function bootstrap_autoloader()
  16. {
  17. require_once COREPATH . 'Classes/Autoload.php';
  18. alias(array(
  19. "Pulse\\Core\\Autoload" => 'Autoload',
  20. ));
  21.  
  22. Autoload::setIncludePath(PKGPATH);
  23. Autoload::register();
  24.  
  25. alias(array(
  26. // all namespace path
  27. "Pulse\\Classes\\Bootstrap" => 'Bootstrap'
  28. ));
  29.  
  30. }
  31.  
  32. }
  33.  
  34. if (!function_exists('alias'))
  35. {
  36.  
  37. function alias($array)
  38. {
  39. foreach ($array as $class => $alias)
  40. {
  41. class_alias($class, $alias);
  42. }
  43. }
  44.  
  45. }
  46.  
  47. bootstrap_autoloader();
  48. $app = new Bootstrap();
  49. $app->set_url($_GET['url']);


Problem pojawił się gdy zabrakło podpowiedzi dla metod tak jak by netbeans nie wiedział już o co chodzi...

AUTOLOADER - https://raw.github.com/gist/221634/2bc31f04...ClassLoader.php przerobiony na statyczny
pamil
W PHP5.3 mamy coś takiego jak słowa kluczowe "namespace" oraz "use" - kod, który tu pokazałeś jest straszny.
Ja osobiście radziłbym zapoznać się z działającym już frameworkiem - polecam Symfony2, pisane dla >=PHP5.3. Zobaczysz, jak coś działa od środka oraz od strony użytkowej - zapoznasz się z dobrymi wzorcami.
Crozin
1. Nie potrafię sobie wyobrazić czego nie można zrozumieć w opisie standardu PSR-0.
2. Jest jakiś konkretny powód dla którego chcesz brać się za tworzenie kolejnego "frameworka" zamiast skorzystać z istniejącego?
KotWButach
Cytat
1. Nie potrafię sobie wyobrazić czego nie można zrozumieć w opisie standardu PSR-0.


Hmm napisałem jak ja to pojmuje i prosiłbym choć o wyjaśnienie czy rozumiem to porwanie a jeżeli nie to co jest nie tak? Jeżeli możesz podeślij wideotutorial z youtuba lub wytłumacz mi jak to ma się do tego co napisałem.

Cytat
2. Jest jakiś konkretny powód dla którego chcesz brać się za tworzenie kolejnego "frameworka" zamiast skorzystać z istniejącego?


Studia



pamil - boje się ze symfony jest dla mnie zbyt trudny a codeigniter nie posiada zbytnio nic poza kilkoma klasami, co jest jego zaletą w nauce i przeszkodą w standardach.
pamil
Na CodeIgnitera to ty nawet nie patrz - niby pisany na nowo, a w środku archaiczny kod z PHP4 rodem. Symfony2 nei jest trudny - właśnie się go uczę, po kilku dniach (nie korzystałem wcześniej z żadnego FW) potrafiłem zrobić przyjemnie w nim dużo rzeczy wink.gif Dokumentacja oraz pomoc społeczności jest naprawdę wystarczająca, nie miałem problemu "prawie-nie-do-rozwiązania". Jeśli masz tydzień-dwa czasu, polecam wykonać przykładowy projekt w Symfony2, możesz się też inspirować Trinity Zyxa - co prawda to eksperymentalny framework, praktycznie bez żadnej dokumentacji i społeczności, ale ciekawe ze względu na prawdziwe MVC.

Co do PSR-0:
Mamy klasę Dostawca\Przestrzen\Nazw\NieskonczonaIlosc\Nazwa_Klasy.php
Definiujemy w autoloaderze, że przestrzeń nazw Dostawca znajduje się w ../lib/Dostawca/.
Teraz gdy autoloader chce załadować tą klasę, znajdzie ją w ../lib/Dostawca/Przestrzen/Nazw/NieskonczonaIlosc/Nazwa/Klasy.php.
Prawda że proste? Można bez kolizji tworzyć we własnej przestrzeni nazw dostawcy, i wiadomo, gdzie dana klasa/interfejs etc. się znajduje.
KotWButach
czyli to co napisałem jak brzydki kod by nie był jest poprawnie w myśl tego standardu?
pamil
Nie, twój kod nie ma sesnu. Do operowania na przestrzeniach nazw mamy "namespace" oraz "use".
KotWButach
No to teraz już nic nie rozumiem...
użyłem do ładowania plików i klass autoloadera o nazwie SplClassLoader który to ładuje tylko za pomocą przestrzeni nazw nie ma innej drogi dla tego autoloadera.
więc plik w katalogu GŁOWNY\COSTAM\COS.PHP ma namespace COSTAM\COS bo GŁOWNY jest wspiany jako głowny katalog dla autoloadera.
pamil
Cytat(KotWButach @ 16.08.2012, 19:32:21 ) *
  1. <?php
  2.  
  3. error_reporting(E_ALL ^ E_NOTICE);
  4. defined('BASEPATH') or define('BASEPATH', str_replace('\\', '/', dirname(realpath(__FILE__))) . '/');
  5. defined('PKGPATH') or define('PKGPATH', BASEPATH . 'Packages/');
  6. defined('APPPATH') or define('APPPATH', PKGPATH . 'App/');
  7. defined('COREPATH') or define('COREPATH', PKGPATH . 'Pulse/');
  8. defined('CONFIGPATH') or define('CONFIGPATH', PKGPATH . 'Config/');
  9.  
  10.  
  11.  
  12. if (!function_exists('bootstrap_autoloader'))
  13. {
  14.  
  15. function bootstrap_autoloader()
  16. {
  17. require_once COREPATH . 'Classes/Autoload.php';
  18. alias(array(
  19. "Pulse\\Core\\Autoload" => 'Autoload',
  20. ));
  21.  
  22. Autoload::setIncludePath(PKGPATH);
  23. Autoload::register();
  24.  
  25. alias(array(
  26. // all namespace path
  27. "Pulse\\Classes\\Bootstrap" => 'Bootstrap'
  28. ));
  29.  
  30. }
  31.  
  32. }
  33.  
  34. if (!function_exists('alias'))
  35. {
  36.  
  37. function alias($array)
  38. {
  39. foreach ($array as $class => $alias)
  40. {
  41. class_alias($class, $alias);
  42. }
  43. }
  44.  
  45. }
  46.  
  47. bootstrap_autoloader();
  48. $app = new Bootstrap();
  49. $app->set_url($_GET['url']);


Chodzi mi o to i używanie class_alias().
KotWButach
czyli według standardu nie powinno używać się class_alias() tylko wypisywać pełne przestrzenie tj wywołanie

  1. \namespacecos\namespacecostam\nazwaklasy();



a co w przypadku gdy zmieni się nazwa folderu X wywołań będzie błędne?

PS: mógłbyś pisać w calości skróty myślowe nie pomagają zbytnio a bardzo staram się to zrozumieć.
I gdybyś był skłonny napisać jak powinno to wyglądać.

----------------------------------

Troche sie pobawiłem czy tak wyglada już dobrze?

  1. <?php
  2. error_reporting(E_ALL ^ E_NOTICE);
  3.  
  4. include 'Packages/Config/Config.php';
  5. include 'Packages/Pulse/Classes/Autoload.php';
  6.  
  7. $Autoload = new Pulse\Classes\Autoload();
  8. $Autoload->setIncludePath(PKGPATH);
  9. $Autoload->register();
  10.  
  11. $app = new Pulse\Classes\Bootstrap;
  12. $app->set_url($_GET['url']);


I bardzo ważna kwestia czy naprawdę jeżeli używa się przestrzeni nazw by utworzyć obiekt jestem skazany na namespace typu aaa\bbb\ccc\ddd\obiekt itp monstra? mam się do tego przyzwyczaić czy to znów nie poprawne jest?
pamil
Tutaj chciałem dać przykład w kodzie, ale jednak nici z tego, także zpoadam kilka linków:
http://docs.php.net/manual/en/language.namespaces.php
http://phpmaster.com/php-namespaces/
http://ttomczyk.pl/archives/182

Co, gdy nazwa folderu się zmieni? Nie będzie działać, i dobrze smile.gif Większość IDE ma opcję refaktoringu, która podmieni ci wszystkie wywołania.

Co do kodu: Włącz używanie E_NOTICE. To jest normalny błąd, nie jakieśtam powiadomienie. Prawidłowo napisany kod nie zwraca żadnego błędu typu E_NOTICE. Uwierz mi, pomyłka w nazwie zmiennej/indeksie tablicy może kosztować sporo nerwów, gdy nie wiesz, że właśnie ją popełniłeś wink.gif

Dalej, odnośnei formy to nic nei ma w nim do oceny, ale styl trochę zawikłany. Raz inicjalizujesz obiekt z nawiasami obok, raz bez. Raz zmienna z dużej litery się zaczyna - raz z małej. Raz używasz takichFunkcji() - a raz takich_funkcji().

Ostatnie pytanie: Oczywiście, że nie. W podanych wyżej linkach wytłumaczone jest słowo kluczowe use.

Ja nadal polecam popracować z Symfony2, nauczyć się dobrych praktyk.

Dodatek: Do czego przydatna jest konwencja nazewnictwa PSR-0?
Polecam całą serię (1-12), prosto od głównego autora Symfony2
Composer
KotWButach
Z tym E_NOTICE mam taki problem że nieco zaciemnia mi kod. Ale może i to mi jakoś wyjaśnisz do tej pory miałem np tak.

  1.  
  2. $cos .= 'blabla';
  3.  


teraz na nowym xampp mam błąd NOTICE i musze robić tak

  1.  
  2. $cos = '';
  3. $cos .= 'blabla';
  4.  


co z kolei powoduje takie smieszne cos.

  1.  
  2. if(!isset($cos)){
  3. $cos = '';
  4. }
  5. $cos .= 'blabla';
  6.  


wiem ze w jezykach innych niz php to koniecznosc ale php to php biggrin.gif Czy możesz i to uściślić?

Czytałem i czytam dalej to co podałeś relacja z tego wydarzenia nieco później bo już spać trzeba ;P
d3ut3r
Nie musisz stosować isset w takim przypadku wystarczy zainicjować zmienną tak jak zrobiłeś to w pierwszym kodzie. PHP dąży do tego co jest standardem w innych językach gdzie zmienne muszą być deklarowane ułatwia to analizę kodu źródłowego.

KotWButach
Cytat(d3ut3r @ 18.08.2012, 06:19:50 ) *
Nie musisz stosować isset w takim przypadku wystarczy zainicjować zmienną tak jak zrobiłeś to w pierwszym kodzie. PHP dąży do tego co jest standardem w innych językach gdzie zmienne muszą być deklarowane ułatwia to analizę kodu źródłowego.


Dobrze wiedzieć smile.gif że PHP sie rozwija a nie zwija smile.gif

Co do isset(); czasem trzeba jeżeli zmienna pochodzi z innego pliku. to albo isset albo przypisanie do innej.

  1. $cos = $z_innej_strony_zmienna;


ale nei wiem czy to cos da bo skoro się nie widzą przez jakiś czas to hmm musze przetestować.

-----------------


Pojawił się problem otóż nie wiem jak sprawdzić w przestrzeniach nazw czy kalsa istnieje.

  1. class_exist([...]) /NIE DZIAŁA


Pomoże ktoś?
d3ut3r
  1. <?php
  2.  
  3. namespace foo;
  4.  
  5. class bar{
  6.  
  7. public function __construct(){
  8.  
  9. }
  10.  
  11. }
  12.  
  13. echo class_exists('foo\bar') ? 'istnieje' : 'nie istnieje';
  14.  
  15. ?>


takie coś powinno zadziałać
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.