Gdzieś w serwisie do logowania, podczas logowania:
$this->session->set("user", $user); // ten, który się właśnie zalogoował, np. name = admin
UsersController::editAction
$this->view->setVar("user", $user); // ten, którego akutalnie edytujemy, np. name = desu
users/edit.volt
<!-- admin - ten z sesji. Nasz user przypisany w controllerze przepadł bez śladu. -->
{{ user.name }}
@Edit
Udało mi się ustalić o co tu kur.. chodzi. Renderowanie widoku wygląda tak:
/**
* Export the variables the current symbol table
*/
if typeof params == "array" {
for key, value in params {
let {key} = value;
}
}
require compiledTemplatePath;
Wszystko pięknie, co nie? W momencie require
powinienem już mieć dostep do mojej zmiennej $user. Okazuje się, że problem jest wcześniej.
Kod odpowiedzialny za kompilowanie .volt
=> .php
z jakieś powodu generował coś takiego:
<!-- teraz odpala się jego ekscelencja magiczny getter, który - po przejściu przez skomplikowany algorytm decyzyjny - zwraca mi usera z kontenera (okazało się, że tam też jest) -->
<?= $this->user->name; ?>
zamiast czegoś takiego
<!-- teraz jest czytana zmienna przypisana w tej śmiesznej pętli u góry, czyli prawidłowo -->
<?= $user->name; ?>
Oto winowajca:
/**
* Services registered in the dependency injector container are available always
*/
let dependencyInjector = this->_dependencyInjector;
if typeof dependencyInjector == "object" && dependencyInjector->has(variable) {
let exprCode .= "$this->" . variable;
} else {
let exprCode .= "$" . variable;
}
Są zmienne równe i równiejsze, w tym wypadku te w kontenerze mają pierwszeństwo, nadpisując te wysłane z kontrolera.
#phalcon