Autor | Zpráva | ||
---|---|---|---|
xaverista Profil |
Zdravím,
chtě bych se zeptat, kde všude bych měl vytvářet instanci třídy. Mám web rozdělen na základní části: index.php kde se přesměrovávají všechny URL a ten funguje jako "router", v určité části kódu pak includuju požadovaný view. Pokud to includuju normálně , tak problém s třídou uvnitř view není, ovšem problém nastává tehdy, kdy už mě nebavilo psát include k danému view a vytvořil jsem si třídu Router: class Router { public static function view($template) { $file = ROOT_DIR . "/app/view/" . $template . ".php"; if(file_exists($file)) { require_once $file; return true; } else { echo "Teplate: " . $file . " does not exists!"; } return false; } } A jakmile se includuje soubor přes tuto třídu, již nelze přistoupit k instanci $user z index.php Příklad ukázky index.php a login.php s include (funguje) index.php $user = new User(); include "view/login.php"; if($user->logged()) { echo "prihlasen"; } Příklad ukázky index.php a login.php s třídou Router (nefunguje user) index.php $user = new User(); Router::view("login"); if($user->logged()) { echo "prihlasen"; } což vypíše chybu: Fatal error: Call to a member function logged() on null in /var/www/auto/app/view/login.php on line 3 Otázka zní tedy, když budu takto includovat pohledy ze třídy, je v pořádku, že budu vytvářet nové potřebné instance v daném souboru? Nebo je vůbec takto zvolený způsob správný? Prostě potřebuji, abych dokázal používat objekt skrz includované soubory. Děkuji za odpověď EDIT:: Tak jsem přišel na to, že tato strategie je asi úplně k ničemu, jelikož nemůžu ve druhé verzi s třídou router přistupovat vůbec k proměnným, které používám nad Routovacím includem :/ |
||
Alphard Profil |
#2 · Zasláno: 11. 6. 2017, 02:50:51
Zdá se mi to překombinované, na načítání tříd bych použil spíše autoload.
|
||
xaverista Profil |
#3 · Zasláno: 11. 6. 2017, 09:39:05
Alphard:
Autoload používám, jde mi hlavně o ty nefunkční proměnné mimo includovaný soubor přes třídu |
||
Keeehi Profil |
#4 · Zasláno: 11. 6. 2017, 09:58:47
xaverista:
Hlavní problém je s viditelností proměnných. Je to stejné, jako proměnná ve funkci, ta taky nevidí ven. Vyřešit se to dá stejně jako u nich, předáním pomocí parametru. class Router { public static function view($template, $parameters = []) { if (!is_array(parameters)) { echo 'Parameter $parameters has to be an array'; return false; } $file = ROOT_DIR . "/app/view/" . $template . ".php"; if(file_exists($file)) { extract($parameters); require_once $file; return true; } else { echo "Teplate: " . $file . " does not exists!"; } return false; } } $user = new User(); Router::view("login", [ 'user' => $user ]); Celé kouzlo je ve funkci extract. Ta vezme asociativní pole a vytvoří z něj proměnné. pozn. 1 Předpokládám, že ta šablona se rovnou vypisuje. Bylo by hezké, kdyby to bylo vidět i z názvu metody. Metodu view bych pojmenoval renderView. |
||
xaverista Profil |
#5 · Zasláno: 12. 6. 2017, 07:46:54
Keeehi:
Funguje, moc děkuji |
||
Časová prodleva: 7 let
|
0