Zrozumienie MVC

0

Witam wszystkich.
Próbuję zrozumieć model MVC w PHP. Chciałbym, żeby ktoś mnie poprawił jeśli coś źle rozumiem. Napiszę jak ja to widzę:

Otóż tak:
Załóżmy, że mam katalog application 3 katalogi: models, views i controllers. W katalogu application znajduje się plik index.php, który pełni rolę routera. W nim znajduje się instrukcja switch..case:

<?php
	if (isset($_SERVER['REQUEST_URI'])) {
		switch ($_SERVER['REQUEST_URI']) {
			case '/mvc/application/homepage.view.php':
				include '../controllers/homepage.controller.php';
			break;
		}
	}
?>

Jeśli wybrany plik widoku to homepage.view.php to przenosi mnie do kontrolera w folderze controllers o nazwie homepage.controller.php. W tym pliku znajdują się operacje na stronie, np. wyświetlenie rekordów z bazy danych itd. W tym pliku znajduje się również na samej górze funkcja:

include '../models/homepage.model.php';

Odnosi ona do pliku z modelem. Wymyśliłem(nie wiem czy to dobrze, czy źle), żeby wszystko co dotyczy jednego pliku posiadało wspólny przedrostek w nazwie. Na przykład jak wyżej:

  1. Model to: homepage.model.php
  2. Widok to: homepage.view.php
  3. Kontroler to: homepage.kontroler.php

Pytanie zasadnicze tylko jest jedno: Czy ja dobrze to rozumiem? Czy taki schemat postępowania z plikami ma rację bytu(no to dwa pytania)
Ogólnie to u mnie to by wyglądało tak: Odpalam widok a do niego dołączany jest kontroler do, którego z kolei dołączany jest model.

0

Zacznij od kontrolera. To on decyduje jaki będzie widok. Przejrzyj frameworki dowolne i zobacz jak to sie tam robi

0

Mógłbyś nieco więcej powiedzieć? Czy zaprezentowany przeze mnie schemat jest zły, jak tak to jakie potencjale błędy czy problemy za nim mogłą iść itd. Ogólnie to sugerowałem się schematami z google grafiki, np:

  1. Link1
  2. Link2

Ale sporo jest właśnie takich jak mówisz, że zaczynają się od kontrolera.

0

Obadaj istniejące frameworki i zobacz jak to jest zorganizowane. Do tego co ma się odpalić służy router, który analizuje adresy url z domeny. Istnieje też coś takiego jak front controller. Obadaj jak on działa i czemu to służy. Wrzuciłes tu troszkę kodu, wiec powiem że zamiast tych includeow powinieneś wykorzystać psr'y i chociażby Composera

0

Próbuję zrozumieć model MVC w PHP. Chciałbym, żeby ktoś mnie poprawił jeśli coś źle rozumiem

Pewnie, że źle zrozumiesz, bo mało kto rozumie wzorzec MVC (może dlatego, że ten wzorzec został wymyślony dla aplikacji desktopowych i stosowanie go na backendzie jest dość dziwne). To co się nazywa mianem MVC dzisiaj to zwykle kompletna wolna Amerykanka.

Więc nie przejmuj się, jeśli źle zrozumiesz, bo nie ma chyba wzorca projektowego w programowaniu tak bardzo różnie rozumianego jak MVC. Każdy rozumie jak chce i każdy może nadawać sens tym trzem literkom dowolnie, a każdy framework ma zwykle własne definicje MVC. Ewentualnie czasami nie jest MVC, tylko podmieniają literkę na coś innego.

Próbuję zrozumieć model MVC w PHP.

Nie wiem jak w PHP ale w klasycznym MVC (a la Smalltalk) masz tak:

  • model to zachowanie i dane
  • kontroler obsługuje mysz i klawiaturę, i kontaktuje się z modelem i widokiem
  • widok to widok, wiadomo.

na backendzie natomiast z tego co zauważyłem, wpycha się odpowiedzialność modelu do kontrolera (pewnie dlatego, że nie ma myszy i klawiatury i ten kontroler musi jednak coś robić). No i pozostaje też pytanie o widok - czy widok w MVC na backendzie to jest widok w przeglądarce (czyli widok z perspektywy użytkownika: frontend), czy widok to będzie szablon z kodem HTML i funkcja odpowiedzialna za wysłanie go do przeglądarki przez HTTP (czyli widok z perspektywy programisty, jednak w dalszym ciągu backend).

Mam wrażenie, że ten wzorzec na backendzie rodzi więcej pytań niż faktycznie rozwiązuje problemy...

1
LukeJL napisał(a):

Mam wrażenie, że ten wzorzec na backendzie rodzi więcej pytań niż faktycznie rozwiązuje problemy...

Ogólnie rzecz biorąc model ten jest po to, aby problemy się nie pojawiały/ aby je ograniczać, głównie przy rozwijaniu już istniejącego kodu. Rozwarstwienie struktury aplikacja ułatwia rozwój każdej z jej warstw bez bezpośredniego wpływu na inne warstwy.

@LukeJL w gruncie rzeczy dobrze napisał, że:

model to zachowanie i dane
kontroler obsługuje mysz i klawiaturę, i kontaktuje się z modelem i widokiem
widok to widok, wiadomo.

...chociaż mam wrażenie, podobnie jak autor powyższego cytatu, że nie wiadomo za bardzo co robić z kontrolerem. Bodaj wczoraj odpisywałem w jakimś wątku o JavieFX i odnosiłem się do tego tematu.

W skrócie: Widok, to widok - po prostu wygląda, sobie jest i nic nie robi. Model, to caaała logika aplikacji, struktury danych, wszelka funkcjonalność, która sprawia, że aplikacja żyje i może zmieniać swój stan. Kontroler natomiast, to jedynie swojego rodzaju pomost, pośrednik między widokiem i modelem. W nim powinno następować jedynie parowanie widoku i jakichś na nim działań opisanych w logice. Definiowanie zachowania aplikacji w kontrolerze jest błędem, bo być może przyjdzie czas, kiedy będziesz chciał wykorzystać to zachowanie w innym widoku i co wtedy? Zrobić "copy/paste"? Redundancja w kodzie jest zła i właśnie m.in. ten problem miał rozwiązać MVC. Wszystkie kluczowe warstwy aplikacji są od siebie oddzielone. Wszystkie warstwy mogą być modyfikowane bez bezpośredniego wpływu na inne warstwy. Każda warstwa zbudowana jest z niepowtarzalnych komponentów, z których każdy może być wykorzystywany w wielu zadaniach.

Nie siedzę za bardzo w webie, więc popraw mnie proszę jeżeli napiszę jakąś głupotę, ale w Twoim przypadku można sobie wyobrazić, że widokiem będzie np. rozkład html/php/whatever, oddzielny skrypt np. js/php/python będzie kontrolerem, w którym będziesz łączył jakiś element widoku z jakimś zachowaniem opisanym w innym skrypcie będącym już częścią logiki i modelu.

Pamiętaj, że organizacja plików aplikacji pomiędzy trzema folderami model/view/controller nie implikuje tego, że aplikacja jest faktycznie oparta o model MVC ;)

2
Uczynny Kret napisał(a):

Pytanie zasadnicze tylko jest jedno: Czy ja dobrze to rozumiem? Czy taki schemat postępowania z plikami ma rację bytu(no to dwa pytania)
Ogólnie to u mnie to by wyglądało tak: Odpalam widok a do niego dołączany jest kontroler do, którego z kolei dołączany jest model.

Nie. Jeden kontroler może przecież serwować wiele widoków, a model to mogą być setki współpracujących ze sobą klas.

LukeJL napisał(a):

Więc nie przejmuj się, jeśli źle zrozumiesz, bo nie ma chyba wzorca projektowego w programowaniu tak bardzo różnie rozumianego jak MVC. Każdy rozumie jak chce i każdy może nadawać sens tym trzem literkom dowolnie, a każdy framework ma zwykle własne definicje MVC.

To, że większość ludzi nie rozumie MVC i nazywa w ten sposób jakieś swoje dziwne wynalazki, to nie znaczy, że definicja tego wzorca nie istnieje i można sobie cokolwiek tak nazwać.
A wersję MVC dla web zdefiniowano i opisano już dawno, ze 20 lat temu.

na backendzie natomiast z tego co zauważyłem, wpycha się odpowiedzialność modelu do kontrolera (pewnie dlatego, że nie ma myszy i klawiatury i ten kontroler musi jednak coś robić).

Wpychanie logiki biznesowej do kontrolera jest właśnie niezgodne z MVC. Jeśli ktoś tak robi, to popełnia błąd, i to co tworzy to nie jest MVC.

No i pozostaje też pytanie o widok - czy widok w MVC na backendzie to jest widok w przeglądarce (czyli widok z perspektywy użytkownika: frontend), czy widok to będzie szablon z kodem HTML i funkcja odpowiedzialna za wysłanie go do przeglądarki przez HTTP (czyli widok z perspektywy programisty, jednak w dalszym ciągu backend).

W typowych webowych frameworkach MVC stosuje się właśnie silniki szablonów, które generują jakby nie patrzeć frontend. Backendem są kontroler i model.

Mam wrażenie, że ten wzorzec na backendzie rodzi więcej pytań niż faktycznie rozwiązuje problemy...

Może masz rację, ale to wynika wyłącznie z ignorancji, lenistwa i nauce programowania z tutoriali tworzonych przez leniwych ignorantów, co powoduje powielanie błędów.

http://commitandrun.pl/2016/05/30/Brutalne_prawdy_o_MVC/

2

W typowych webowych frameworkach MVC stosuje się właśnie silniki szablonów, które generują jakby nie patrzeć frontend. Backendem są kontroler i model.

Chodziło mi o to, że "silniki szablonów, które generują frontend", jeśli odpalają się po stronie serwera, to są tak czy siak backendem, bo są na serwerze.

Dopiero w przeglądarce mogą stać się frontendem, ale wtedy już przestaną być silnikami szablonów tylko staną się kodem HTML (zakładam tutaj, że są to szablony tylko i wyłącznie po stronie serwera, a nie jakieś SPA). Subtelna różnica, ale jednak o ile nad silnikami szablonów masz kontrolę dopóki są po stronie backendu (i możesz je traktować jako "widok", taki frontend backendu, i np. karmić je danymi z bazy), to już jak są wygenerowane i przesłane do przeglądarki, to "widok" zaczyna żyć własnym życiem i można się komunikować z nim tylko przez internet.

(w ogóle może być tak, że MVC jest w zasadzie bardziej czymś w rodzaju fraktala. Z jednej strony można by powiedzieć, że Frontend to Widok, Backend to Model, a HTTP to Kontroler, ale jak wejdziemy głębiej, to zarówno Backend jak i Frontend można podzielić na Model/Widok/Kontroler - na frontendzie widokiem mógłby być np. React, modelem Redux a kontrolerem kod, który pomiędzy nimi pośredniczy. W samym komponencie React też masz z jednej strony widok - funkcję render, z drugiej strony masz model (czyli props i state) a z trzeciej strony masz funkcję obsługujące zdarzenia myszy choćby, czyli taki kontroler)

(czyli sam komponent Reactowy zawiera w sobie całe MVC a jednocześnie może być uznawany tylko za część V większej całości).

Wpychanie logiki biznesowej do kontrolera jest właśnie niezgodne z MVC. Jeśli ktoś tak robi, to popełnia błąd, i to co tworzy to nie jest MVC.

Zgadzam się z tym, problem w tym, że inni tego nie wiedzą. A o ile jeszcze w dyskusji można wyklaryfikować co dane pojęcia znaczą, to jak przejedziesz się po githubie, to już tak łatwo nie będzie, bo co framework, to różne definicje.

Nie chodzi mi o to, żeby wyznawać wolną amerykankę - sam czerpię informację na temat MVC z old schoolowych opisów do Smalltalka (języka, w którym w końcu MVC powstało), tylko raczej o to, że ta wolna amerykanka już istnieje.

Jakbym miał się kłócić o wszystkie pojęcia źle rozumiane, to by się okazało, że całe programowanie jest źle rozumiane:

  • oprócz MVC źle rozumiane jest choćby OOP (dochodzi do absurdów, gdzie ludzie myślą, że OOP polega głównie na dziedziczeniu),
  • programowanie funkcyjne jest mylone z proceduralnym albo jest traktowane na zasadzie że "są funkcje",
  • Agile jest źle rozumiane i traktowane tylko jako robienie "sprintów" (cokolwiek ten sprint w praktyce znaczy. Czyli często po prostu tyle, że się planuje raz na tydzień i nazywa to edżajlem),
  • Scrum jest rozumiany czasem głównie jako robienie spotkań na stojąco czy odprawianie innych dziwnych rytuałów towarzyskich (chociaż akurat Scrum to chyba sam w sobie jest taki porąbany)
  • TDD jest źle rozumiane (gdzie unit jest rozumiany jako metoda i testy są 1:1 sprzężone z kodem produkcyjnym - co nieuniemożliwia potem jakikolwiek większy refaktor bez zmiany testów),
  • DDD jest rozumiane czasem jako zestaw wzorców projektowych typu repo, encja, agregat itp., bez myślenia w ogóle o dziedzinie, którą się modeluje (wystarczy poczytać wątki na tym forum, gdzie ktoś włazi w DDD i tylko nad tym się zastanawia, w którym folderze który wzorzec wcisnąć, bo koniecznie chce użyć wzorca z książki).
  • z kolei wzorce projektowe są nagminnie albo źle rozumiane, albo wciskane tam gdzie ich nie powinno być i nieużywane, tam gdzie pasują

Z drugiej strony warto oczywiście edukować ludzi (ew. wejść w polemikę tam, gdzie nie jest to oczywiste, gdzie może istnieć wiele poglądów na dany temat - też nie warto być dogmatykiem myślę, nie wszystko jest zawsze jasno zdefiniowane).

Ale to całe wykoślawianie idei mnie akurat bawi bo można zaskakiwać ludzi nietypowymi stwierdzeniami, które są prawdziwe (a przynajmniej: można je logicznie uzasadnić) a brzmią absurdalnie, bo ludzie się przyzwyczaili już do wykoślawionego rozumienia.

0
LukeJL napisał(a):

Chodziło mi o to, że "silniki szablonów, które generują frontend", jeśli odpalają się po stronie serwera, to są tak czy siak backendem, bo są na serwerze.

Niby tak, tylko ten silnik szablonów nie jest w ogóle backendowi do działania potrzebny. Po prostu serwer zwraca cały kod kliencki, a nie tylko dane, ale nadal to jest jedna aplikacja.

(w ogóle może być tak, że MVC jest w zasadzie bardziej czymś w rodzaju fraktala. Z jednej strony można by powiedzieć, że Frontend to Widok, Backend to Model, a HTTP to Kontroler, ale jak wejdziemy głębiej, to zarówno Backend jak i Frontend można podzielić na Model/Widok/Kontroler - na frontendzie widokiem mógłby być np. React, modelem Redux a kontrolerem kod, który pomiędzy nimi pośredniczy. W samym komponencie React też masz z jednej strony widok - funkcję render, z drugiej strony masz model (czyli props i state) a z trzeciej strony masz funkcję obsługujące zdarzenia myszy choćby, czyli taki kontroler)

(czyli sam komponent Reactowy zawiera w sobie całe MVC a jednocześnie może być uznawany tylko za część V większej całości).

Nie, to po prostu jest oddzielna aplikacja frontendowa, która z backendu pobiera tylko dane. A backend to druga aplikacja, która te dane serwuje.
No i fakt, obie mogą być zgodne z MVC, ale to nie jest fraktal tylko współpraca.

Zgadzam się z tym, problem w tym, że inni tego nie wiedzą. A o ile jeszcze w dyskusji można wyklaryfikować co dane pojęcia znaczą, to jak przejedziesz się po githubie, to już tak łatwo nie będzie, bo co framework, to różne definicje.

Definicja jest jedna, jeśli ktoś wymyśla swoje, to już jego problem.

Jakbym miał się kłócić o wszystkie pojęcia źle rozumiane, to by się okazało, że całe programowanie jest źle rozumiane:

No ba, niezrozumienia wszędzie pełno, ludzie uczą się z tutoriali pisanych przez ludzi, którzy sami ledwie tydzień wcześniej przeczytali tutorial na dany temat, a doświadczenie mają nikłe.
Ja edukować i poprawiać nie przestanę, nawet jeśli tylko do 1 na 100 osób dotrze, to i tak sukces. A takich, którzy zrozumieć nie chcą, po prostu trzeba unikać w pracy... Bo jeśli ludzie są zbyt leniwi, nawet żeby się rozwijać, to nie będzie się dało na nich zwalać nudnej roboty. ;)

0

Tutaj na stacku jest wyjaśnione:
https://stackoverflow.com/questions/4530023/does-php-supports-mvp-pattern

Przy czym w praktycznej realizacji chodzi o MVP czyli pochodną MVC, choć i na bazie tego mogą być problemy. Ale jest też wyjaśnione na czym polega różnica.

Nikt normalny nie będzie dzisiaj pisał niczego nawet w oparciu o MVP fundamentalnie od zera tylko z użyciem któregoś frameworka, gdzie jakby nie było i tak wszystko zasadniczo opiera się o ten właśnie pattern. Tak samo niczego się w kodzie ręcznie nie includuje, bo od tego jest autoload, który w najprostszej realizacji może być oparty wyłącznie o położenie plików z klasami w określonym katalogu. A to że masa wiedzy z tutoriali jest niepraktyczna to już inna sprawa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1