Revize kódu (SessionManager)

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

Zdravím všechny, v Nette a celkově s PHP nedělám zas tak dlouho a dělám takový „hokusy pokusy“. Napsal jsem si SessionManager, který mi ještě více zjednodušuje práci se Session a chtěl bych vás poprosit zda je to takhle ve spolupráci s Nette správně. Jde mi hlavně o to, zda nemám někde třeba zachytávat vyjímky přes try-catch? Děkuji kdo si najde čas se na to podívat.

namespace Manage;

use Nette;



/**
 * Session Manager
 */
class SessionManager extends Nette\Object
{

	private $session;


	public function __construct(Nette\Http\Session $session)
	{
		$this->session = $session;
	}



	/**
	 * Save session to specific section
	 *
	 * @param $section
	 * @param $name
	 * @param $value
	 *
	 * @return mixed
	 */
	public function saveSession($section, $name, $value)
	{
		$session = $this->getSection($section);
		$session->$name = $value;

		return TRUE;
	}



	/**
	 * Get saved session
	 *
	 * @param $section
	 * @param $name
	 *
	 * @return bool|mixed
	 */
	public function getSession($section, $name)
	{
		$session = $this->getSection($section);

		return $session->$name;
	}



	/**
	 * Get section
	 *
	 * @param $section
	 *
	 * @return bool|Nette\Http\SessionSection
	 */
	public function getSection($section)
	{
		$session = $this->session->getSection($section);

		return $session;
	}



	/**
	 * Remove session
	 *
	 * @param $section
	 * @param null $name
	 */
	public function removeSession($section, $name = NULL)
	{
		if (is_null($name)) {
			$this->getSection($section)->remove();
		} else {
			unset($this->getSection($section)->$name);
		}
	}

}
enumag
Člen | 2118
+
0
-

Mám z té třídy pocit že si to spíše zesložiťuješ než zjednodušuješ. Mám z toho pocit že používáš section se určitým názvem z různých míst v aplikaci, což ale není dobře. Lepší je napsat si nějakou službu, do té injectnout Session a v této službě používat konkrétní section. Všechna práce s tou section by měla být zapouzdřená v té službě, nikdo venku by neměl ani znát název té section.

SessionManager takovou službou není protože nepoužívá konkrétní section ale všechny metody chtějí název section jako parametr.

Jako příklad bych ti doporučil třídu Nette\Http\UserStorage. Ta implementuje rozhraní IUserStorage, ale nikdo venku ani netuší že vnitřně využívá session (natož jméno konkrétní sekce).

Ripper
Člen | 56
+
0
-

**enumag **

Ahoj, děkuji za vysvětlení, zní to logicky. A kdybych si do té služby injectoval právě tuhle SessionManager tak by to bylo také špatně?

enumag
Člen | 2118
+
0
-

Špatně asi ne, zbytečné ano.