* @license http://www.gnu.org/licenses/gpl-2.0.txt GPL, version 2 * @author Icinga Development Team */ // {{{ICINGA_LICENSE_HEADER}}} namespace Icinga\User\Preferences; use Icinga\Authentication\Session; use \SplObserver; use \SplSubject; use Icinga\User\Preferences; use Icinga\Exception\ProgrammingError; /** * Modify preferences into session */ class SessionStore implements SplObserver, LoadInterface { /** * Name of session var for preferences */ const DEFAULT_SESSION_NAMESPACE = 'preferences'; /** * Session data * * @var Session */ private $session; /** * Create a new object * * @param Session $session */ public function __construct(Session $session) { $this->session = $session; } /** * Receive update from subject * * @link http://php.net/manual/en/splobserver.update.php * @param SplSubject $subject * @throws ProgrammingError */ public function update(SplSubject $subject) { if (!$subject instanceof Preferences) { throw new ProgrammingError('Not compatible with '. get_class($subject)); } $changeSet = $subject->getChangeSet(); $data = $this->session->get(self::DEFAULT_SESSION_NAMESPACE, array()); foreach ($changeSet->getCreate() as $key => $value) { $data[$key] = $value; } foreach ($changeSet->getUpdate() as $key => $value) { $data[$key] = $value; } foreach ($changeSet->getDelete() as $key) { unset($data[$key]); } $this->session->set(self::DEFAULT_SESSION_NAMESPACE, $data); $this->session->write(); } /** * Public interface to copy all preferences into session * * @param array $preferences */ public function writeAll(array $preferences) { $this->session->set(self::DEFAULT_SESSION_NAMESPACE, $preferences); $this->session->write(); } /** * Load preferences from source * * @return array */ public function load() { return $this->session->get(self::DEFAULT_SESSION_NAMESPACE, array()); } }