V konstruktoru Identity špatný namespace u Traversable
- Werkov
- Člen | 17
Ahoj,
objevil jsem podle mě chybu v konstruktoru v
\Nette\Security\Identity
.
public function __construct($id, $roles = NULL, $data = NULL)
{
$this->setId($id);
$this->setRoles((array) $roles);
$this->data = $data instanceof Traversable ? iterator_to_array($data) : (array) $data;
}
Patří tam namísto Traversable absolutní \Traversable. Respektive takto mi to teprve začalo fungovat správně na PHP 5.3.3 s poslední verzí Nette (1.0-alpha ze dne 17. 9. 2010).
Jelikož mi trvalo skoro dva dny, než jsem toto objevil, nedá mi to sem nenapsat. Nefungovalo mi přihlašování. V Auth presenteru jsem se sice přihlásil, ale po přesměrování jinam, jsem přihlášen nebyl a co víc, byla smazaná i celá session.
Když jsem při přihlašování tvořil novou identitu, předával jsem ji
jako data
třídu poděděnou od \Ormion\Record
,
která dědí od \Ormion\Storage
, která rozhodně
Traversable
je (tedy \Traversable
:-). Kvůli tomu se
to však nerozpoznalo a data byla upravena (zmršena) přetypováním na pole
namísto iterator_to_array
, čímž se do identity dostaly
i všelijaké vnitřnosti (private
) z
\Ormion\Record
.
No a konec je jednoduchý, mezi těmi private
proměnnými byly
i neserializovatelné (\Ormion\Collection
apod., toto jsem ještě
zcela nepochopil), ale při obnovení ze session to samozřejmě někde potichu
„kikslo“ a celá session se vytvořila čistě nová.