Portál AbcLinuxu, 5. května 2025 23:07

Dotaz: PHP - MVC - Objektové programování

20.11.2014 17:53 Petr
PHP - MVC - Objektové programování
Přečteno: 415×
Odpovědět | Admin
Ahoj. Chtěl bych se zeptat, zda při použití objektového programovaní na úrovni MVC volit cestu takovou, že na počátku je jediná volaná class a vše ostatní je vnořené do sebe, nebo volat jednotlivé class MVC přímo z "rootu" dané aplikace? Děkuji za případné obsajsnění. Petr
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

20.11.2014 18:29 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP - MVC - Objektové programování
Odpovědět | | Sbalit | Link | Blokovat | Admin
V indexu vždy nejprve otevřu databázi a předám ji konstruktoru modelu. V továrně si pak podle URL vyrobím instanci kontroleru nebo vieweru (podle metody POST či GET) a ten model jí předám opět v konstruktoru.

Kontroler či viewer mají tedy odkaz na model a mohou s ním komunikovat. Viewer vždy produkuje string s webovým obsahem, kontroler vždy provede přesměrování pomocí header(). V indexu ten výstupní string pouze nechám vypsat.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
20.11.2014 18:40 Petr
Rozbalit Rozbalit vše Re: PHP - MVC - Objektové programování
Takto to myslíš?
$pdo = new PDO(...);

$constructor = new Constructor($pdo);
$tovarna = new Tovarna($pdo, $constructor);

class Tovarna{
...
$model = new Model($pdo);
$view = new View();
...
}


echo $tovarna->printlayout();
Josef Kufner avatar 20.11.2014 18:53 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: PHP - MVC - Objektové programování
Přečti si nějaký pěkný článek o dependency injection.

Pointa celého toho přístupu je v tom, že jednotlivé komponenty (model, view, controller, různé konektory a další věci) si nevytvářejí nástroje, které používají, ale dostanou je zvenčí.

Tedy někde na vrchu sedí objekt, který ví, jak má aplikace vypadat. Vytvoří všechny potřebné komponenty, propojí je dohromady (např. pomocí parametrů konstruktorů) a pak je nechá pracovat.

Když chceš později jedno komponentu vyměnit, stačí upravit ten objekt na vrchu. Pokud nový objekt zachovává kompatibilní API, není potřeba zasahovat jinde. (Což je důvod, proč je singleton špatný.)
Hello world ! Segmentation fault (core dumped)
20.11.2014 18:59 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP - MVC - Objektové programování
Používám Simple Factory:
function tovarna($model, $method, $url){
    $className = fce($method, $url);
    return new $className($model);
}

$db = new PDO(...);
$model = new Model($db);
echo tovarna($model, $method, $url);
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
20.11.2014 19:17 Petr
Rozbalit Rozbalit vše Re: PHP - MVC - Objektové programování
A kde máš controller a view ?
20.11.2014 19:26 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP - MVC - Objektové programování
Ten přece vyrábím v té továrně. Jeho název v $className je odvozen z URL a metody POST či GET prostým slepením. Běžně mám několik desítek až set viewerů a kontrolerů a volám jen jeden z nich.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Josef Kufner avatar 20.11.2014 18:46 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: PHP - MVC - Objektové programování
Odpovědět | | Sbalit | Link | Blokovat | Admin
Obvykle je to tak, že index.php provede základní inicializaci a pak vytvoří instanci třídy Aplikace a nechá ji udělat vše, co je třeba. Stejně to dělá například i Qt s třídou QApplication.

Tou základní inicializací myslím include class loaderu a předání parametrů, jako je například document root a podobně, případně nastavení logování. Nemělo by toho být moc.

Docela se mi osvědčilo mít init.php, který tuto inicializaci provede a na konci je return array($context, $config);, takže v index.php mám už jen list($context, $config) = require 'init.php';. Výhodou je, že další scripty mohou použít velmi snadno stejnou inicializaci. Aplikace by měla mít jen jeden vstupní bod (index.php), ale občas se hodí mít možnost vytvořit si snadno berličku, ať už pro vyzkoušení něčeho nebo pro integraci jiných nástrojů.
Hello world ! Segmentation fault (core dumped)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.