V konstruktoru Identity špatný namespace u Traversable

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Werkov
Člen | 17
+
0
-

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á.

David Grudl
Nette Core | 8228
+
0
-

Opraveno. Jeden znak a co způsobí…