Hledáme nového kolegu do redakce - 100% home office, 100% flexibilní pracovní doba. Více informací.
Využij akce až 80 % zdarma při nákupu e-learningu - více informací. Zároveň pouze tento týden sleva až 80 % na e-learning týkající se Swift

Lekce 1 - Popis MVC architektury

Vítejte u prvního dílu seriálu, ve kterém si postupně vytvoříme plně objektový redakční systém v PHP. Budeme ctít tzv. MVC architekturu, kterou si vysvětlíme v dnešním úvodním článku. Z následujících dílech naprogramujeme web s hezkými URL, přihlašováním, WYSIWYG editorem a kontaktním formulářem. Vytvoříme také několik užitečných tříd, aby se další funkčnosti do webu jednoduše přidávaly.

Jsem vždy udiven obrovskou velikostí zdrojových kódů třetích stran, když jdou věci řešit jednoduše. Náš kód bude minimalistický a celý systém bude obsahovat několik třídiček, které budou velmi krátké.

Seriál počítá se základy objektově orientovaného programování v PHP.

MVC architektura

MVC je velmi oblíbený architektonický vzor, který se uchytil zejména na webu, ačkoli původně vznikl na desktopech. Je součástí populárních webových frameworků, jakými jsou např. Zend nebo Nette pro PHP, Ruby On Rail pro Ruby nebo MVC pro ASP .NET. Osobně si bez něj (nebo nějakého podobného principu) nedokáži představit složitější web.

Princip

Základní myšlenkou MVC architektury je oddělení logiky od výstupu. Řeší tedy problém tzv. "špagetového kódu", kdy máme v jednom souboru (třídě) logické operace a zároveň renderování výstupu. Soubor tedy obsahuje databázové dotazy, logiku (např. PHP operace) a různě poházené HTML tagy. Vše je zamotané do sebe jako špagety. Určitě jste to někde viděli, půjčím si nějaký zdroják z prvních PHP tutoriálů na ukázku:

// Tento kód je jak by náš projekt neměl vypadat
$vysledek = mysql_query("select * from otazky", $spojeni);
if (!mysql_num_rows($vysledek))
    echo '<p>Zatím tu žádnou anketu nemáme.</p>';
else
{
    echo '<ul>';
    while ($radek = mysql_fetch_array($vysledek))
    if ($vybranaanketa == $radek['kodankety'])
        echo '<li>' . $radek['kodankety'] . ': ' . $radek['otazka'] . ' (aktuálně vybraná)</li>';
    else
        echo '<li><a href="tvorbaanket.php?vybranaanketa=' . $radek['kodankety'] . '">'
        .$radek['kodankety'] . ': '
        .$radek['otazka'] . '</a></li>';
    echo '</ul>';
}

Kód se samozřejmě špatně udržuje, natož rozšiřuje. Je špatně highlightovaný, protože si s ním IDE neví rady, HTML není správně naformátováno, ztrácíme se v jeho stromové struktuře. Naším cílem je, aby zdrojový kód s logikou vypadal jako zdrojový kód (např. PHP) a výstup vypadal jako HTML stránka s co nejmenší příměsí dalšího kódu. Kód výše by se tedy rozdělil do 2 souborů (HTML šablony a PHP skriptu), ideálně ještě s použitím dalších tříd. Již brzy v seriálu uvidíme, jak kód MVC aplikace vypadá.

Komponenty

Celá aplikace je rozdělena na komponenty 3 typů, hovoříme o Modelech, View (pohledech) a Controllerech (kontrolerech), od toho MVC. Neexistuje žádná striktní definice MVC architektury a tak se můžete setkat s více výklady. Je dost možné, že to, co zde popisuji, je architektura MVP (nebudu rozebírat) nebo dokonce něco mezi. Co člověk, to názor, co framework, to jiný přístup. Důležitý je však základní princip, tedy rozdělení hlavních rolí těchto 3 komponent.

Komponenty jsou samozřejmě třídy, které mohou být odděděné z abstraktních předků, jen view je většinou jen jako HTML šablona. Pojďme si jednotlivé komponenty nejprve popsat.

Model

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Komponenta model z MVC architektury Model obsahuje logiku a vše, co do ní spadá. Mohou to být výpočty, databázové dotazy, validace a podobně. Model vůbec neví o výstupu. Jeho funkce spočívá v přijetí parametrů zvenku a vydání dat ven. Zdůrazním, že parametry nemyslím URL adresu ani žádné jiné parametry od uživatele. Model neví, odkud data v parametrech přišla a ani jak budou výstupní data zformátována a vypsána.

Budeme programovat bez tzv. ORM (objektově relačního mapování), jelikož PHP defaultně nic takového nemá a hotová řešení jsou zbytečně těžkopádná. Navíc PHP obsahuje skvělé datové struktury, které s dynamickým typováním nahradí vše potřebné. Pokud vám zkratka ORM nic neříká, vůbec to nevadí. Budeme využívat principu manažerů, logika aplikace tedy bude rozdělena např. mezi manažer ManazerUzivatelu, ManazerClanku a tak podobně. Ty obsahují metody k výběru potřebných údajů z databáze nebo k jejich modifikaci, např. metodu k výběru přezdívky a informací o uživateli při vypsání jeho profilu. Jinou metodou bychom vybírali otisk hesla z databáze, abychom ověřili přihlášení, další by nám vrátila třeba články uživatele. V manažeru zároveň najdeme pomocné metody k práci s uživateli, např. ono ověření správné délky a znaků hesla. Logika se nemusí týkat jen databáze, patří sem i ostatní věci jako validace (např. ověření správné délky a formátu zadaného hesla).

Nyní máme představu, co model vykonává, pojďme se podívat na pohled.

Pohled

Komponenta view z MVC architektury Pohled (View) se stárá o zobrazení výstupu uživateli. Nejčastěji se jedná o phtml šablonu, obsahující HTML stránku a tagy nějakého značkovacího jazyka, který umožňuje do šablony vkládat proměnné, případně provádět iterace (cykly) a podmínky. Opět zachováme maximální jednoduchost a stejně jako tomu bylo s ORM, i zde si vystačíme pouze s tím, co nám nabízí PHP. Pro šablony se často používají speciální značkovací jazyky (např. Smarty). Pro PHP nemá ale příliš velký smysl používat značkovací jazyk, jelikož je samo značkovacím jazykem a umožňuje takový styl zápisu kódu, aby struktura HTML stránky zůstala zachována.

Pohledů máme mnoho, např. pro funkcionalitu s entitou uživatele: uzivatel_regis­trace, uzivatel_prih­laseni, uzivatel_profil a podobně. Pohled uzivatel_profil je ale již společný všem uživatelům a jsou do něj posílána různá data, vždy podle toho, koho zrovna zobrazujeme. Tato data jsou poté dosazena do HTML elementů šablony.

Pohledy lze samozřejmě vkládat do sebe, abychom se neopakovali (šablona s rozložením stránky, šablona s menu a šablona článkem).

View není jen šablona, ale zobrazovač výstupu. Obsahuje tedy minimální množství logiky, která je pro výpis nutná (např. kontrola, zda si uživatel vyplnil prezdívku před jejím vypsáním nebo cyklus s komentáři, které se vypisují).

View podobně jako Model vůbec neví, odkud mu data přišla, stará se jen o jejich zobrazení uživateli.

Kontroler

Komponenta controller z MVC architektury Kontroler je nyní onen chybějící prvek, který osvětlí funkčnost celého vzoru. Jedná se o jakéhosi prostředníka, se kterým komunikuje uživatel, model i pohled. Drží tedy celý systém pohromadě a komponenty propojuje. Jeho funkci pochopíme z ukázky životního cyklu stránky. Opět existuje mnoho různých přístupů, nejčastěji má každá entita jeden kontroler, máme tedy UzivatelKontroler, ClanekKontroler a tak podobně.

Životní cyklus stránky

Životní cyklus zahajuje uživatel, který zadá do prohlížeče adresu webu a parametry, kterými nám sdělí, kterou podstránku si přeje zobrazit. Budeme chtít zobrazit detail uzivatele s id 15. Udělejme si ukázku URL adresy:

http://www.domena.cz/uzivatel/detail/15

Požadavek jako první zachytí tzv. směrovač (router). Ten podle parametrů pozná, který kontroler voláme. Jistě bychom vymysleli mnoho způsobů, jak jméno kontroleru poznat. Udržujme maximální jednoduchost a vypusťme tzv. manuální routování, název kontroleru jednoduše uvedeme jako 1. parametr v URL. Zde je tedy zavolán kontroler UzivatelKontroler, kterému jsou předány 2 parametry "detail" a 15.

Daný kontroler podle parametrů pozná, co se po něm chce, tedy že má zobrazit detail uživatele. Zavolá model, který uživatele vyhledá v databázi a vrátí jeho údaje. Dále zavolá další metodu modelu, která např. vypočítá věk uživatele. Tyto údaje si kontroler ukládá do proměnných. Nakonec vypíše pohled (view). Název pohledu poznáme podle akce, kterou provádíme. Pohledu jsou předány proměnné s příslušnými daty. Kontroler tedy poslechl uživatele, obstaral podle parametrů dotazu data od modelu a předal je pohledu.

Pohled přijme data od kontroleru a vloží je do připravené šablony. Hotová stránka je zobrazena uživateli, který často o celé této kráse ani netuší :)

Celou situaci můžeme znázornit diagramem:

MVC architektura

Získali jsme tedy oddělení logiky od výstupu, view jsou jako HTML, modely zas v našem skriptovacím jazyce (např. v PHP). Dosáhli jsme přehlednosti kódu, který je logicky rozčleněný.

MVC architektura nám usnadňuje i myšlení při vývoji projektu. Když píšeme logiku, patří do modelu, formátování a stylování výstupu řešíme v šabloně, to co uživatel chce z parametrů zjišťujeme v kontroleru. 3 různé problémy na 3 různých místech, oddělené tak, aby do sebe nezasahovaly a nedělaly nám vývoj složitější.

Příště začneme s inicializací systému a směrovačem v lekci .htaccess, autoloader a obecný kontroler.


 

Všechny články v sekci
MVC - Jednoduchý redakční systém v PHP objektově
Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
79 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, sushi a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity

 

 

Komentáře

Avatar
martinkobelka
Redaktor
Avatar
martinkobelka:28.12.2012 18:09

No tak tenhle seriál mi za celou dobu co programuji dal asi nejvíc. Autorovi všechna čest. Dříve jsem dělal pomocí špagetového kódu vše, a vše do sebe. Teď už nad logikou trochu přemýšlím.

 
Odpovědět
28.12.2012 18:09
Avatar
Kuba
Neregistrovaný
Avatar
Kuba:26.11.2013 19:40

Není lepší používat framework např. náš Nette.

 
Odpovědět
26.11.2013 19:40
Avatar
Martin Suchodol
Redaktor
Avatar
Odpovídá na Kuba
Martin Suchodol:26.11.2013 19:48

Nevím hele něktěří lidé radějí dělají „čistým“ php já mezi ně patřím neříkám že frameworky nemají něco do sebe ale já si prostě vše udělám rád od nuly

 
Odpovědět
26.11.2013 19:48
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kuba
Kit:26.11.2013 20:06

Ne. Jestli však chceš, můžeš tady o Nette napsat článek. Pochybuji však, že Nette je tvůj.

Editováno 26.11.2013 20:08
Odpovědět
26.11.2013 20:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kuba
Neaktivní uživatel:26.11.2013 20:10

Minimálně v tomto tutorialu to nemá cenu, pokud se podíváš na vývoj Nette. I kdyby autor článek zpracoval v jiném frameworku, skončilo by to nakonec jako tutorial o frameworku. Jinak úryvek z mého článku:

Proč použít už existující framework?

Jistě jste narazili na již existující řešení. Například Nette nebo Zend. Někdy je použití těchto frameworků vhodnější, než použít vlastní. Při vytváření frameworku vlastně znovuvytváříte kolo. Jestli si kolo vezmete a použijete, nebo si ho postavíte sami je ale důležité. Při vytváření kola používáte nástroje. S nástroji pak umíte lépe pracovat, když s nimi máte více zkušeností. Také víte jak kolo přesně pracuje. Někdy je ale skutečně lepší jednoduše sáhnout po existujícím kolu.

1.) Disponuje-li takovou funkčností, která se vám zamlouvá, která vám vyhovuje, bude lepší použít toto řešení.
2.) Jestliže se projektu účastní více vývojářů, vytváření vlastního frameworku práci akorát zpomalí.
3.) Měli byste být vstřícní ke klientům, takže i v případě, kdy klient dává existujícímu řešení přednost.
4.) Je-li deadline projektu blízko

Odpovědět
26.11.2013 20:10
Neaktivní uživatelský účet
Avatar
Kit
Redaktor
Avatar
Odpovídá na Neaktivní uživatel
Kit:26.11.2013 20:23

Používání frameworků smrdí kargo-kultem. Kromě toho: Kdyby se všichni spoléhali na kolo, nikdo by nevynalezl vrtuli.

Odpovědět
26.11.2013 20:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:26.11.2013 20:25

Vypsal jsem tam přeci vhodné důvody používání frameworku. Já ho vlastně nepoužívám, ale někdy to prostě je nutné.

Odpovědět
26.11.2013 20:25
Neaktivní uživatelský účet
Avatar
Kit
Redaktor
Avatar
Odpovídá na Neaktivní uživatel
Kit:26.11.2013 20:32

Možná jsem to napsal až moc kategoricky. Když jsem si prohlížel zdrojáky Nette, tak se mi nelíbily. Příliš mnoho funkcí pro mé účely a na můj vkus nepřehledné používání. Někomu však Nette vyhovuje a proto ho používá.

Odpovědět
26.11.2013 20:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:26.11.2013 20:37

Přesně stejný účinnek to má na mě. Všechno složitě a nepřehledně vymyšlené (samozřejmě nechci urazit někoho, kdo to používá, jestli mu to vyhovuje). Existují lepší cesty vývoje.

Odpovědět
26.11.2013 20:37
Neaktivní uživatelský účet
Avatar
Apollo
Neregistrovaný
Avatar
Odpovídá na Martin Suchodol
Apollo:29.11.2013 8:36

Výborně zpracovaný seriál zabývající se problematikou MVC. Jinak nette používá v podstatě stejnou architekturu ale v nette je ta nevýhoda že pokud v něm neděláš již hodně dlouho tak nevíš co se v něm pořádně děje + i když již děláš stejně ti občas něco unikne. Takže tento serial je užitečný i pro člověka který by chtěl nette začít využívat a zatím nepoužíval žádnou architekturu.

 
Odpovědět
29.11.2013 8:36
Avatar
roknarok2
Člen
Avatar
roknarok2:11.1.2014 23:02

Zkoušel jsem něco podle návodů. Mohlo by to nějak takhle být?
http://www.itnetwork.cz/dev-lighter/284

Potom samozřejmě dědím atd..

class CommentsController extends Controller{
private $model;

public function __construct($mo­del){
$this->$model=$model;
}

 
Odpovědět
11.1.2014 23:02
Avatar
roknarok2
Člen
Avatar
roknarok2:12.1.2014 14:07

Nikdo?

 
Odpovědět
12.1.2014 14:07
Avatar
Odpovídá na roknarok2
Martin Konečný (pavelco1998):12.1.2014 14:19

Nejsem na MVC nějaký expert, ale proč do View předáváš Controller?

Odpovědět
12.1.2014 14:19
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Drahomír Hanák
Redaktor
Avatar
Odpovídá na roknarok2
Drahomír Hanák:12.1.2014 14:26

Tahle se to zdá být správné. V MVC může být vazba z View na Controller. Používá se pro volání událostí.

V PHP se IMHO na klasické webové aplikace hodí spíš MVP (které tu sdraco popisuje), kde View na Controller vazbu nemá. Controller tady slouží jako prostředník, který zpracovává události a data z modelu předává do view.

 
Odpovědět
12.1.2014 14:26
Avatar
roknarok2
Člen
Avatar
roknarok2:12.1.2014 14:33

Díky za odpovědi. Teď už budu jenom rozšiřovat.

 
Odpovědět
12.1.2014 14:33
Avatar
Franta
Neregistrovaný
Avatar
Franta:18.2.2014 5:20

Zdravím,
Děkují za pěkný seriál.
Zajímalo by mě ale jak vyřešit controlery více urovní.
třeba adresy
web.cz/informa­ce/prehled
web.cz/informace/ke-stazeni

jestli je lepší udělat jeden controler informace a jen měnit šablony nebo vytvářet vnořené kontrolery. Třeba když budu chtít web.cz/zamestnan­ci/prehled.
kontroler Prehled pro informace a kontroler zamestnance by byl jiný. Zkuste mi prosím nahodit nějaký nápad. (nepište kódy jen nějakou vhodnou myšlenku). Nechci použit web.cz/prehled/in­formace a web.cz/prehled/za­mestnanci jelikož to mám podle kategorií z menu.

 
Odpovědět
18.2.2014 5:20
Avatar
michalkasparec
Redaktor
Avatar
michalkasparec:18.2.2014 8:37

Udělej jen jeden controller (Informace) a pak už jen dělej různý action (prehled, keStazeni, ...). Je zbytečné dělat více kontrolerů. Zase ale záleží jak to máš a chceš mít řešený.
Na to co si uvedl by to bylo takto asi nejlepší.
Kontroler by se měl starat o podobné věci. Je například zbyečné, aby si měl v jednom kontroleru správu uživatelů a zároveň s tím download. To je už lepší oddělit :)
snad je to srozumitelný

 
Odpovědět
18.2.2014 8:37
Avatar
Franta
Neregistrovaný
Avatar
Franta:21.2.2014 9:50

Děkuji. takže udělat jeden kontroler s více metodama a podle parametru si je vybírat a v nich volat příslušné modely že?

 
Odpovědět
21.2.2014 9:50
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
gullyCZ
Člen
Avatar
Odpovídá na Neaktivní uživatel
gullyCZ:14.7.2014 16:11

Pokud říká člověk A, měl by říct zároveň i B. Pokud existují lepší cesty vývoje, jaké to jsou?

 
Odpovědět
14.7.2014 16:11
Avatar
svanda777
Redaktor
Avatar
svanda777:24.7.2014 9:35

Jak by se v MVC architektuře udělala oddělená administrace? Mám udělat složku a do ní udělat celý nový MVC web?

 
Odpovědět
24.7.2014 9:35
Avatar
Odpovídá na svanda777
Neaktivní uživatel:24.7.2014 9:39

Nestačil by jen nový kontroler?

Odpovědět
24.7.2014 9:39
Neaktivní uživatelský účet
Avatar
svanda777
Redaktor
Avatar
svanda777:24.7.2014 9:40

Také mne to napadlo, ale potřebuji mít jiný layout.

Editováno 24.7.2014 9:41
 
Odpovědět
24.7.2014 9:40
Avatar
Milan Křepelka
Redaktor
Avatar
Odpovídá na svanda777
Milan Křepelka:24.7.2014 14:08

To nemá s architekturou MVC nic společného. Třeba v ASP.NET MVC říkáš - všechna View mají nějaký konkretní default layout. Ale není problém pro každé View či skupinu View definovat nějaký jiný layout.

 
Odpovědět
24.7.2014 14:08
Avatar
Michal Kuba
Redaktor
Avatar
Michal Kuba:1.1.2016 22:32

Ahoj.
Mohu pomocí MVC dosáhnout toho, že mám webovou stránku a administrace bude jinak graficky udělaná? Myslím tím, že když zadám www.domena.cz/administrace, aby se otevřela administrace, ale bez prvků z rozlozeni.phtml (menu, postranní panel, patička). Nebo si mám na hostingu udělat jakože další subdoménu admin.domena.cz a tam to dělat všechno?

Díky za odpovědi :)

 
Odpovědět
1.1.2016 22:32
Avatar
Odpovídá na Michal Kuba
Martin Konečný (pavelco1998):1.1.2016 23:51

Zdar,

pochopitelně můžeš, otázkou je, jak složitý si to uděláš :D
Teď z hlavy bych asi nevymyslel dobré řešení, zvlášť protože tohle za mě řeší framework (zkus se podívat, jak se v Nette dělají moduly, třeba ti to trochu helpne).
Hodně zjednodušeně to v Nette funguje tak, že si pro každý modul uděláš jiné presentery (controllery) a jiné šablony (včetně obecného layoutu, do kterého se jednotlivé šablony vkládají).
Pomocí URL adresy pak router pozná, který modul se má načíst (v podstatě jde jen o složku, např. si uděláš routu, že všechny stránky, které začínají slovem admin (třeba admin/users, admin/overview atd.), jsou v modulu AdminModule a veškeré presentery a šablony se budou načítat právě z tohoto modulu).

Odpovědět
1.1.2016 23:51
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:2.1.2016 8:41

Úplně teď nemám tolik času, kolik bych potřeboval, takže Nette nechám na doučení se později a asi udělám teda administraci tak, že udělám subdomenu a té udělám vlastní šablonu a vše bud komunikovat se stejnou db :) Ale díky za nápad, takhle jak to píšeš to chápu, jenže neumím Nette, takže bych to asi těžko skládal dohromady :)

 
Odpovědět
2.1.2016 8:41
Avatar
Odpovídá na Michal Kuba
Martin Konečný (pavelco1998):2.1.2016 11:44

Nemyslel jsem, aby ses učil Nette, jen se podíval, jak tam ty moduly fungují (pokud to vůbec někde je napsaný) :)

Odpovědět
2.1.2016 11:44
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Dušan Janotik:15.3.2018 23:17

Zdravím v prvom rade chcem poďakovať za skvelý seriál. Chcel by som sa spýtať či môže pohľad priamo komunikovať s modelom. Teda či môžem v pohľade priamo vytvoriť nový model a použiť jeho metódu.
Príklad môjho kódu, kód nižšie je kód pohľadu

    <?php foreach ($persons as $person) : ?>
<tr>
<td>
  <?php $um = new UserManager();
               $helper = $um->getUsername($person);
               echo $helper ?>
</td>
</tr>

    <?php endforeach ?>

aplikácia funguje perfektne ale zaujíma ma či je správne a povolené v MVC architektúre. Či som tým neporušil nejaké pravidlá. Čo si o tom myslíte ?

 
Odpovědět
15.3.2018 23:17
Avatar
Odpovídá na Dušan Janotik
Michal Šmahel:16.3.2018 0:53

Z mého pohledu je to chyba v návrhu. Samozřejmě pokud to budeme vztahovat přímo na MVC. Pohled by měl komunikovat výhradně s kontrolerem (když už), v ideálním případě ani s ním (v MVP je toto volnější). Pohled by měl data obdržet od kontroleru.

Kontroler si získá data od modelu. Tyto data následně předá pohledu při jeho načtení. Pohled obsahuje pouze HTML strukturu, případně šablonové nástroje pro generování kódu z dat od kontroleru.

Odpovědět
16.3.2018 0:53
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Lasvit
Člen
Avatar
Odpovídá na Dušan Janotik
Lasvit:16.3.2018 9:31

Ano, úplně porušil, pokud si tento článěk přečteš pořádně, tak si všimneš, že pohled totálně neví o modelu a vyplnuje se pouze kontrollerem.

 
Odpovědět
16.3.2018 9:31
Avatar
Dušan Janotik:16.3.2018 10:34

Ďakujem za rady, veľmi ste mi pomohli.

 
Odpovědět
16.3.2018 10:34
Avatar
danhosek
Člen
Avatar
danhosek:4.3.2020 7:02

Čau, pro jakou verzi PHP je seriál dělaný? Je již upravený pro PHP 7.2.?

 
Odpovědět
4.3.2020 7:02
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na danhosek
David Čápka:4.3.2020 12:10

Seriál učí používat MVC architekturu v PHP a je stále aktuální a i bude nadále aktuální, protože ta architektura se nikdy nezmění. Co konkrétně bys tam chtěl upravovat pro PHP 7.2?

Editováno 4.3.2020 12:12
Odpovědět
4.3.2020 12:10
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
danhosek
Člen
Avatar
Odpovídá na David Čápka
danhosek:5.3.2020 18:55

Čau, stále se mi nedaří projekt spustit. v apatche error.log je toto (viz příloha) Je to špatným nastavením mého localhost (xampp) nebo jsem udělal chybu v projektu?
Děkuji.

 
Odpovědět
5.3.2020 18:55
Avatar
Radim Stehlík:10.12.2020 20:10

Zdravím, potřeboval bych radu jak si toto spustím v podaadreasri například localhost/lear­n/test1/ .... kdyz to spustim přesměruje se na localhost/chyba ... jak správně nastavit výchozí root adresa? dekuji

 
Odpovědět
10.12.2020 20:10
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 35 zpráv z 35.