Autor Zpráva
scrazzy
Profil
Zdravím všechny,
aktuálně se snažím zjistit jakým způsobem nejlépe strukturovat objektově psaný PHP projekt. Neměl jsem štěstí abych na netu narazil na toto téma, proto jsem si jako původem javista definoval následující strukturu a zajímala by mne konstruktivní kritika a poznámky k funkčnosti ve složitějších projektech. Budu také rád za informace a odkazy na články týkající se tohoto tématu.

Rozdělení obsahu souborů na logiku, prezentace a modely:

xxx.php - (view) - tyto soubory obsahují pouze funkci require_once('xxx.cont.php') která do nich přidává jejich controller, kromě require obsahují již jen HTML kód, echa a printy proměnných. Myšlenka je maximálně oddělit HTML kód od logiky v kódu PHP.

xxx.cont.php - (controller) - tzv. controller klasické php stránky, zde je zapsána veškerá logika, výpočty, všechny includy, připojení k databázi atd. bez jakéhokoliv HTML kódu. taktéž obsahuje require_once funkce __autoload($class) která nahrává potřebné třídy.

xxx.class.php - (model) - soubor obsahuje pouze definici třídy objektu

*.inc.php - soubory obsahují php kód který se někde opakovaně vkládá, např. funkci __autoload($class) nebo nastavení pro různé databáze atd.

Dělení souborů v adresářích (již není tak podstatné):

/ (root webu) - obsahuje *.php stránky, které jsou určeny přímo uživateli
/class - obsahuje třídy objektů (*.class.php)
/controller - obsahuje controllery stránek z rootu webu (*.cont.php)
/inc - obsahuje include soubory s kódem který nemá jiné zařazení (*.inc.php)

V rootu je rovněž umístěn .htaccess soubor který zakazuje přístup k souborům .class.php, .inc.php a .cont.php.

Myslíte, že má taková struktura šanci obstát například v projektu intranetových stránek, či jiném složitém projektu? Kde vidíte slabiny či naopak výhody této struktury?

zdrojové kódy: https://dl.dropbox.com/u/44949615/oop.zip
Alphard
Profil
require není příliš potřeba, používáme autoload.
V rootu je obvykle jediná spustitelná stránka index.php, přes kterou se zobrazuje veškerý obsah.
Soubory si pojmenujte, jak se vám líbí, ale konvence jako *.cont.php, *.class.php apod. nepozoruji. To vám nestačí dát do patřičného adresáře?
Uvažujete namepsaces? Ve větších projektech pomohou udělat pořádek.
Ugo
Profil
Neni třeba číst daleko a je zřejmá jedna velká slabina, co když má controller víc pohledů? Databázi a výpočty bych dával spíš do modelu, jak píšeš je tam veškerá logika, přitom logika aplikace patří spíš do toho modelu, cotnroller je jen spojnice mezi view a modelem + nějaký ty podmínky atp. kterým se nedá ubránit (teorie a praxe je přecijen hodně jiná ;)) Nesnaž se začínat od viewu, když to prohodíš a do controlleru dáš include view, tak získáš to samé s lepší variabilitou
Joker
Profil
scrazzy:
To není správný MVC návrh.

V první řadě business logika, tj. „veškerá logika, výpočty,… “ nemá být v controlleru, ale v modelu.
Controller by měl jen určit, co uživatel chce, zavolat odpovídající funkčnost modelu anebo servisní vrstvy, zvolit view pro zobrazení uživateli a předat model do view.
Model by měl být ta část, která obsahuje logiku aplikace.
View nemá mít vazbu na controller, ale na model.

Když dám příklad těch zodpovědností.
Řekněme, že návštěvník aktualizuje data uživatele.
První na řadu přijde controller, který má zjistit, že se chce změna dat uživatele. Zavolá příslušný model (tj. nejspíš třídu uživatele). Model zkontroluje, jestli data jsou platná. Pokud jsou, tak v závislosti na návrhu aplikace model nebo servisní vrstva data uloží. Podle výsledku operace pak controller vybere view- buď informaci o chybě, nebo informaci o tom, že data byla uložena. Pak controller předá do view odpovídající model s daty. View pak uživateli prezentuje data z modelu.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: