Piszę na nowo swój stary program w PHP. Z założenia aplikacja ma działać lokalnie, a przeglądarka będzie pełnić rolę interface'u, stąd zdecydowałem się nie zaprzęgać Symfony2. Z drugiej strony chciałem napisać nieco lepszy kod, więc podpiąłem Twiga, a paradygmat strukturalny zamieniam na OOP. Aplikacja bazuje na wzorcu MVC.
Zmienne możemy współdzielić między plikami, używając mechanizmu sesji. Patrząc jednak na obecny kod, tablica $_SESSION wydaje się być dość słabym rozwiązaniem. Wyczytałem, że Symfony2 posiada klasę Session, która świetnie wpasowuje się w OOP. Istnieje jednak coś takiego jak zmienne globalne w Twigu:
$twig = new Twig_Environment($loader);
$twig->addGlobal('text', new Text());
I niby wszystko jest OK, ale mam kilka plików kontrolera. Załóżmy, że mamy dwa pliki index.php oraz somefile.php. Strona powitalna prosi użytkownika o podanie nicku. Mniej więcej zrealizowałem to tak:
...
$loader = new Twig_Loader_Filesystem(__DIR__.'/templates');
$twig = new Twig_Environment($loader);
...
echo $twig->render('index.html.twig', array(
...
));
A w szablonie index.html.twig mamy osadzony formularz:
<form method="post" action="somefile.php">
<input type="text" name="name" placeholder="Nick">
<input type="submit" value="Submit">
</form>
I w somefile.php mamy taką strukturę:
...
$loader = new Twig_Loader_Filesystem(__DIR__.'/templates');
$twig = new Twig_Environment($loader);
...
echo $twig->render('somefile.html.twig', array(
'user' => $user->name(),
...
));
To powoduje, że nie mogę wykorzystać metody addGlobal(), bo zmienna $twig z pierwszego pliku kontrolera przestaje istnieć, gdy skrypt index.php się wykona. Załadowanie somefile.php powoduje utworzenie nowego obiektu, który nie zna zmiennych globalnych. W jaki sposób rozwiązać ten problem?