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";
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");
login.php
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
Zdá se mi to překombinované, na načítání tříd bych použil spíše autoload.
xaverista
Profil
Alphard:
Autoload používám, jde mi hlavně o ty nefunkční proměnné mimo includovaný soubor přes třídu
Keeehi
Profil
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
Keeehi:
Funguje, moc děkuji

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: