Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Poprawnosc kodu wzorca MVC, i gdzie pisac widok?
Forum PHP.pl > Forum > PHP
adrianpl20
Witam. Zacząłem naukę o klasach i wzorcu MVC. Napisałem jako pierwsze takie "coś" w formie ćwiczenia. Prosiłbym o sprawdzenie tego kodu i o podpowiedzenie mi, czy poprawnie te klasy, metody oraz kod w nich, napisałem, i gdzie tworzy się widok? Tak jak teraz to zrobiłem w klasie View z wykorzystaniem switch'y, czy powinno się includować plik html z widokiem? Z góry dziękuję za pomoc.

index.php
  1. <?php
  2.  
  3. require_once 'classes.php';
  4.  
  5. ?>
  6.  
  7. <html>
  8. <head>
  9. <link rel="stylesheet" href="main.css" type="text/css" />
  10.  
  11. <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
  12. </head>
  13. <body>
  14.  
  15. <div class="page">
  16. <div class="top"></div>
  17.  
  18. <a href="?page=kontakt">Kontakt</a>
  19. <a href="?page=pomoc">Pomoc</a>
  20. <a href="?page=oferta">Oferta</a>
  21.  
  22. <?php
  23.  
  24. $controller = new Controller();
  25. $controller->load();
  26.  
  27.  
  28.  
  29. ?>
  30.  
  31. elo
  32. </div>
  33. </body>
  34. </html>


classes.php
  1. <?php
  2.  
  3. class Model {
  4.  
  5. }
  6. class View {
  7.  
  8. public function showPage($param) // protected
  9. {
  10. switch($param)
  11. {
  12. case 'kontakt':
  13. {
  14. echo '<div><b>Kontakt</b></div>';
  15. echo '<p>Jesli chcesz sie z nami skontaktowac napisz do nas na adres email</p>';
  16.  
  17. break;
  18. }
  19. case 'pomoc':
  20. {
  21. echo '<div><b>Pomoc</b></div>';
  22. echo '<p>Nie udzielamy pomocy, spierniczac.</p>';
  23.  
  24. break;
  25. }
  26. case 'oferta':
  27. {
  28. echo '<div><b>Oferta</b></div>';
  29. echo '<p>Oferujemy wszystko i nic, za darmo i drogo.</p>';
  30.  
  31. break;
  32. }
  33. }
  34. }
  35.  
  36. }
  37. class Controller {
  38.  
  39. private $page;
  40. private $view;
  41.  
  42. public function load()
  43. {
  44. $this->page = $_GET['page'];
  45. $this->view = new View;
  46.  
  47. switch($this->page)
  48. {
  49. case 'kontakt':
  50. $this->view->showPage('kontakt');
  51. break;
  52.  
  53. case 'pomoc':
  54. $this->view->showPage('pomoc');
  55. break;
  56.  
  57. case 'oferta':
  58. $this->view->showPage('oferta');
  59. break;
  60. }
  61. }
  62.  
  63. }
  64.  
  65.  
  66. ?>
nospor
Do kodu PHP uzywa sie BBCODE PHP. Prosze poprawic.

Klasa View nie powinna miec w sobie calego kodu HTML. Klasa View ma wczytywac odpowiedni plik z widokiem
adrianpl20
Poprawione.

Okej plik, rozumiem, a poza tym wszystko jest w porządku? Na innym forum, ktoś mi napisał, że ten kod ma mało wspólnego z MVC i że można/łatwiej użyć jeszcze FrontControllera (sprawdzałem na wiki, to dodatkowy wzorzec chyba do uzycia z MVC), czy jest on uzywany, potrzebny?
Pyton_000
Google: "MVC php"

1-szy wynik:
http://ferrante.pl/frontend/php/wzorzec-mvc-w-php/

adrianpl20
Coś tam "namazałem" od nowa, prosiłbym o sprawdzenie struktury i kodu (po maks. kilkanascie linijek w pliku wiec nie duzo) http://www.sendspace.com/file/bn7n5f Z góry dziękuję.
Daimos
Pod tym linkiem, który teraz podałeś jest jakaś dziwna strona z milionem reklam, a gdzie kod?
wink.gif
Pyton_000
@up trol?
https://fs04n4.sendspace.com/dl/08a56dffaa3...n7n5f/httpd.rar
Daimos
no bez jaj Panowie, niedługo zaczną na chomiki wrzucać albo inne cuda, przecież to nie jest biblioteka zenda, żeby nie można było pokolorować na forum
adrianpl20
Nie chciałem tworzyć w kij długiego postu, pomyslałem że tak bedzie łatwiej przejrzeć. Proszę o pomoc, czekam juz kilka dni i to mnie blokuje przed dalszą nauką...
Posio
To do cholery wstaw kod, bo nikt tu lewych paczek nie chce ściągać...
adrianpl20
Okej, proszę, kod:

struktura katalogów:
/controllers/
/views/
/models/
/index.php

/controllers/controller.php
  1. <?php
  2.  
  3. class Controller {
  4.  
  5. public function loadView($path)
  6. {
  7. require_once 'views/head.php';
  8. require_once $path;
  9. require_once 'views/footer.php';
  10. }
  11.  
  12. }
  13. ?>


/controllers/index.php
  1. <?php
  2.  
  3. class indexController extends Controller {
  4.  
  5. public function index()
  6. {
  7. $this->loadView('views/index.php');
  8. }
  9. }
  10. ?>


/controllers/kontakt.php
  1. <?php
  2.  
  3. class kontaktController extends Controller {
  4.  
  5. public function index()
  6. {
  7. $this->loadView('views/kontakt.php');
  8. }
  9. }
  10. ?>


/views/view.php
  1. <?php
  2.  
  3. class View {
  4.  
  5. public function __construct() {
  6. require_once 'head.php';
  7. }
  8.  
  9. public function __destruct() {
  10. require_once 'footer.php';
  11. }
  12. }
  13.  
  14.  
  15. ?>


/views/head.php
  1. <html>
  2. <head>
  3. <title>Strona glownA</title>
  4. </head>
  5. <body>


/views/footer.php
  1.  
  2. <div class="footer">
  3. Copyright &copy; 2014
  4. </div>
  5. </body>
  6. </html>


/views/index.php
  1. <h3>Witaj na stronie glownej</h3>
  2.  
  3. <ul>
  4. <li>Co tam?</li>
  5. <li>Jak sie masz?</li>
  6. </ul>


/views/kontakt.php
  1. <h3>Skontaktuj sie z nami</h3>
  2.  
  3. <ul>
  4. <li>Napisz email</li>
  5. <li>Spadaj</li>
  6. </ul>


/models/
brak plików

/index.php
  1. <?php
  2.  
  3. require_once 'controllers/controller.php';
  4. require_once 'views/view.php';
  5.  
  6.  
  7. function prepareUri($str)
  8. {
  9. return basename(trim($str));
  10. }
  11.  
  12. if(!empty($_GET['page']))
  13. {
  14. $page = prepareUri($_GET['page']);
  15. }
  16. else
  17. {
  18. $page = 'index';
  19. }
  20.  
  21. if(!empty($_GET['action']))
  22. {
  23. $page_action = prepareUri($_GET['action']);
  24. }
  25. else
  26. {
  27. $page_action = 'index';
  28. }
  29.  
  30. if(file_exists('controllers/'.$page.'.php')) // sprawdzam czy istnieje kontroler
  31. {
  32. require_once 'controllers/'.$page.'.php'; // wczytuje plik kontrolera
  33.  
  34. $temp = $page.'Controller';
  35. $controller = new $temp(); // tworze obiekt kontrolera
  36. $controller->$page_action(); // wywoluje akcje kontrolera
  37. }
  38. else // jesli kontroler nie istnieje
  39. {
  40. header('Status: 404 Not Found');
  41. echo '<html><body><h1>Page Not Found</h1></body></html>';
  42. }
  43.  
  44. ?>
Posio
jak pozamykasz wszystko w [/php] a nie [/code] to będzie idealnie.

Ogólnie interpretacja tego jak powinien wyglądać wzorzec MVC jest różna. Ile frameworków tyle interpretacji. W jednych kontroler posiada xxxx linijek kodu a w innych xx z tym że xxxx linijek jest zawartych w modelu.

Oólnie to wygląda tak (łopatologicznie tak jak tylko potrafię) Kontroler - jest czymś w rodzaju pośrednika, zarządza logiką czyli tym "CO JAK GDZIE" Model - to jest nasze "COŚ" czyli najczęściej wyniki jakiś zapytań z bazy które później chcemy umieścić w widoku.
No i widok jest to sposób prezentacji. Ale to tak trochę wstępnie... W każdym razie staraj się robić tak (mówię trochę przyszłościowo), że po zmianie czegoś w modelu, nie jesteś zmuszony do zmiany czegoś w kontrolerze. Staraj się separować te 3 rzeczy, jak tylko najbardziej potrafisz. Rób tak, aby każda z nich była niezależna.
Moim zdaniem niepotrzebnie już pomieszałeś tutaj widok z kontrolerem (metoda loadView). Kombinuj tak, żebyś zasobami widoku operował W WIDOKU.

Czyli jeśli już zdecydowałeś się na taką formę prezentacji treści, postaraj się, żeby to się odbywało mw tak:
  1. $view->setHeader('heder.html');
  2. $view->setContent('>> TUTAJ TWOJA TREŚĆ <<');
  3. $view->render();

moim zdaniem powinieneś z miejsca pomyśleć o tym jak stworzyć coś na wzór layoutu i "ładowarki" do niego. Ale to wszystko ustalasz w widoku smile.gif
adrianpl20
ok, poprawiłem, przeniosłem metodę loadView do widoku views/view.php
teraz te zmienione pliki wyglądają tak, prawidłowo już?:

views/view.php
  1. <?php
  2.  
  3. class View {
  4.  
  5. public function loadView($path)
  6. {
  7. require_once 'views/head.php';
  8. require_once 'views/'.$path;
  9. require_once 'views/footer.php';
  10. }
  11. }
  12.  
  13. ?>


controllers/controller.php
  1. <?php
  2.  
  3. class Controller {
  4.  
  5.  
  6.  
  7. }
  8.  
  9. ?>


controllers/index.php
  1. <?php
  2.  
  3. class indexController {
  4.  
  5. public function index()
  6. {
  7. View::loadView('index.php');
  8. }
  9. }
  10.  
  11. ?>


controllers/kontakt.php
  1. <?php
  2.  
  3. class kontaktController {
  4.  
  5. public function index()
  6. {
  7. View::loadView('kontakt.php');
  8. }
  9. }
  10.  
  11. ?>
Damonsson
Jak już masz controller.php i świeci pustkami, to możesz wykorzystać np do tego, żeby nie walić w każdym kontrolerze static, tylko przekazywać sobie obiekt od razu do kontrolera:

  1. <?php
  2. class Controller {
  3. public function __construct() {
  4. $this->view = new View();
  5. }
  6. }
  7.  
  8. ?>



  1. <?php
  2.  
  3. class indexController extends Controller {
  4.  
  5. public function __construct() {
  6. parent::__construct();
  7. }
  8.  
  9. public function index()
  10. {
  11. $this->view->loadView('index.php');
  12. }
  13. }
  14.  
  15. ?>
pyro
To z tym chciałeś pisać tego facebooka O_O ?

Poza tym, co napisał @Damonsson, takie coś:
Cytat(adrianpl20)
  1. <?php
  2.  
  3. class View {
  4.  
  5. public function loadView($path)
  6. {
  7. require_once 'views/head.php';
  8. require_once 'views/'.$path;
  9. require_once 'views/footer.php';
  10. }
  11. }
  12.  
  13. ?>

...jest głośnym wołaniem o pomstę do nieba. To widok ma decydować o tym, co wyświetla. Ponadto nie ma możliwości choćby zarządzania katalogiem z widokami.
adrianpl20
Metoda loadView przecież jest w widoku, więc nie bardzo rozumiem o co innego chodzi, może o utworzenie osobnych metod setHeader, setFooter i wywołanie ich w metodzie loadView zamiast require header.php i require footer.php ? I o co chodzi z zarządzaniem katalogiem z widokokami?
pyro
Cytat(adrianpl20 @ 25.02.2014, 09:02:09 ) *
Metoda loadView przecież jest w widoku, więc nie bardzo rozumiem o co innego chodzi


Nie jest w widoku, jest w klasie ładującej widok.

Cytat(adrianpl20 @ 25.02.2014, 09:02:09 ) *
nie bardzo rozumiem o co innego chodzi, może o utworzenie osobnych metod setHeader, setFooter i wywołanie ich w metodzie loadView zamiast require header.php i require footer.php ?


To by była zmiana ze złego... na złe.

Cytat(adrianpl20 @ 25.02.2014, 09:02:09 ) *
I o co chodzi z zarządzaniem katalogiem z widokokami?


Co jak będę chciał użyć header2.php, zamiast header.php? Albo załadować widok z vendor/plugin/views ?
adrianpl20
założyłem, że header zawsze będzie taki sam na każdej podstronie. Więc ręcznie w każdym widoku trzeba będzie wpisywać ładowanie headera np w __construct ?
pyro
Cytat(adrianpl20 @ 25.02.2014, 09:10:18 ) *
założyłem, że header zawsze będzie taki sam na każdej podstronie. Więc ręcznie w każdym widoku trzeba będzie wpisywać ładowanie headera np w __construct ?


Nie powinno się nic zakładać, tylko zrobić tak, żeby w razie potrzeby dało się zmienić.
Damonsson
Cytat
Więc ręcznie w każdym widoku trzeba będzie wpisywać ładowanie headera np w __construct


Niekoniecznie, możesz sobie wywoływać defaultowo tak jak masz, ale dodać do tego jeszcze parametry jakieś, które jeśli dodasz to wywołają inny head/foot jaki podasz w parametrach.
pyro
Cytat(Damonsson @ 25.02.2014, 09:28:40 ) *
Niekoniecznie, możesz sobie wywoływać defaultowo tak jak masz, ale dodać do tego jeszcze parametry jakieś, które jeśli dodasz to wywołają inny head/foot jaki podasz w parametrach.


....natomiast znacznie lepszym pomysłem byłoby pozostawienie widoku widokowi. Jeżeli będzie potrzeba użycia innych ram dokumentu, wystarczy wtedy określić szablon rodzica albo jak w w/w - zaincludować inne pliki.
adrianpl20
Usunąłem metodę loadView.

Teraz zrobiłem tak:
controllers/controller.php
  1. <?php
  2.  
  3. class Controller {
  4.  
  5. public $view;
  6.  
  7. public function __construct() {
  8. $this->view = new View;
  9. }
  10.  
  11. }
  12.  
  13. ?>


controllers/index.php
  1. <?php
  2.  
  3. class indexController extends Controller {
  4.  
  5. public function index()
  6. {
  7. $this->view->setHeader('views/head.php');
  8. $this->view->setContent('views/index.php');
  9. $this->view->setFooter('views/footer.php');
  10. $this->view->render();
  11. }
  12. }
  13.  
  14. ?>


view/view.php
  1. <?php
  2.  
  3. class View {
  4.  
  5. private $header_path;
  6. private $content_path;
  7. private $footer_path;
  8.  
  9. public function setHeader($path) // ustawia header
  10. {
  11. $this->header_path = $path;
  12. }
  13. public function setContent($path) // ustawia content
  14. {
  15. $this->content_path = $path;
  16. }
  17. public function setFooter($path) // ustawia stopke
  18. {
  19. $this->footer_path = $path;
  20. }
  21. public function render() // wyswietla widok
  22. {
  23. // header
  24. if(!empty($this->header_path) && file_exists($this->header_path))
  25. require_once $this->header_path;
  26.  
  27. // content
  28. if(!empty($this->content_path) && file_exists($this->content_path))
  29. require_once $this->content_path;
  30.  
  31. // footer
  32. if(!empty($this->footer_path) && file_exists($this->footer_path))
  33. require_once $this->footer_path;
  34. }
  35.  
  36. }
  37.  
  38. ?>


w views/index.php mam tylko html

Pomoże ktośquestionmark.gif?

hello..
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.