Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Poprawnosc kodu wzorca MVC, i gdzie pisac widok?
adrianpl20
post 20.02.2014, 12:50:34
Post #1





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 20.02.2014

Ostrzeżenie: (10%)
X----


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


Ten post edytował adrianpl20 20.02.2014, 12:57:07
Go to the top of the page
+Quote Post
nospor
post 20.02.2014, 12:54:49
Post #2





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6297
Dołączył: 27.12.2004




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


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
adrianpl20
post 20.02.2014, 12:58:50
Post #3





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 20.02.2014

Ostrzeżenie: (10%)
X----


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?

Ten post edytował adrianpl20 20.02.2014, 13:01:19
Go to the top of the page
+Quote Post
Pyton_000
post 20.02.2014, 13:26:27
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Google: "MVC php"

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

Go to the top of the page
+Quote Post
adrianpl20
post 22.02.2014, 14:38:47
Post #5





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 20.02.2014

Ostrzeżenie: (10%)
X----


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ę.
Go to the top of the page
+Quote Post
Daimos
post 22.02.2014, 18:18:33
Post #6





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

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


Pod tym linkiem, który teraz podałeś jest jakaś dziwna strona z milionem reklam, a gdzie kod?
wink.gif


--------------------
scriptun.com. Startup z poradnikami do gier ttp.zone i ttpzone.pl
Go to the top of the page
+Quote Post
Pyton_000
post 22.02.2014, 18:46:23
Post #7





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


@up trol?
https://fs04n4.sendspace.com/dl/08a56dffaa3...n7n5f/httpd.rar
Go to the top of the page
+Quote Post
Daimos
post 22.02.2014, 19:38:21
Post #8





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

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


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


--------------------
scriptun.com. Startup z poradnikami do gier ttp.zone i ttpzone.pl
Go to the top of the page
+Quote Post
adrianpl20
post 23.02.2014, 00:17:26
Post #9





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 20.02.2014

Ostrzeżenie: (10%)
X----


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

Ten post edytował adrianpl20 23.02.2014, 00:18:46
Go to the top of the page
+Quote Post
Posio
post 23.02.2014, 00:31:52
Post #10





Grupa: Zarejestrowani
Postów: 417
Pomógł: 44
Dołączył: 23.06.2011

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


To do cholery wstaw kod, bo nikt tu lewych paczek nie chce ściągać...
Go to the top of the page
+Quote Post
adrianpl20
post 23.02.2014, 00:39:12
Post #11





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 20.02.2014

Ostrzeżenie: (10%)
X----


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


Ten post edytował adrianpl20 23.02.2014, 11:53:11
Go to the top of the page
+Quote Post
Posio
post 23.02.2014, 00:52:21
Post #12





Grupa: Zarejestrowani
Postów: 417
Pomógł: 44
Dołączył: 23.06.2011

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


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

Ten post edytował Posio 23.02.2014, 00:52:49
Go to the top of the page
+Quote Post
adrianpl20
post 25.02.2014, 00:43:22
Post #13





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 20.02.2014

Ostrzeżenie: (10%)
X----


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. ?>
Go to the top of the page
+Quote Post
Damonsson
post 25.02.2014, 08:26:13
Post #14





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


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. ?>
Go to the top of the page
+Quote Post
pyro
post 25.02.2014, 08:40:52
Post #15





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


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.

Ten post edytował pyro 25.02.2014, 08:45:36


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
adrianpl20
post 25.02.2014, 09:02:09
Post #16





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 20.02.2014

Ostrzeżenie: (10%)
X----


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?

Ten post edytował adrianpl20 25.02.2014, 09:02:34
Go to the top of the page
+Quote Post
pyro
post 25.02.2014, 09:07:54
Post #17





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


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 ?


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
adrianpl20
post 25.02.2014, 09:10:18
Post #18





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 20.02.2014

Ostrzeżenie: (10%)
X----


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 ?
Go to the top of the page
+Quote Post
pyro
post 25.02.2014, 09:11:41
Post #19





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


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


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
Damonsson
post 25.02.2014, 09:28:40
Post #20





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


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.

Ten post edytował Damonsson 25.02.2014, 09:29:31
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 27.04.2024 - 11:24