Benutzer: Gast
Eintrag: Extbase: Backend-/Frontend-Session Class

Extbase: Backend-/Frontend-Session Class

von: marcel
Kreise: Typo3

my_ext/Classes/Domain/Session/SessionHandler.php

Code: PHP
<?php
namespace VENDOR\MyExt\Domain\Session;

class SessionHandler {
	/**
	 * Keeps TYPO3 mode.
	 * Either 'FE' or 'BE'.
	 *
	 * @var string
	 */
	protected $mode = NULL;
	
	/**
	 * The User-Object with the session-methods.
	 * Either $GLOBALS['BE_USER'] or $GLOBALS['TSFE']->fe_user.
	 * 
	 * @var object
	 */
	protected $sessionObject = NULL;
	
	/**
	 * The key the data is stored in the session.
	 * @var string
	 */
	protected $storageKey = 'tx_myext';
	
	/**
	 * Class constructor.
	 * @param string $mode
	 */
	public function __construct($mode = NULL) {
		if ($mode) {
		  $this->mode = $mode;
		}
		
		if ($this->mode === NULL || ($this->mode != "BE" && $this->mode != "FE")) {
			throw new \Exception( "Typo3-Mode is not defined!", 1388660107 );
		}
		$this->sessionObject = ($this->mode == "BE") ? $GLOBALS['BE_USER'] : $GLOBALS['TSFE']->fe_user;
	}
	
	/**
	 * Setter for storageKey
	 * @return void
	 */
	public function setStorageKey($storageKey) {
		$this->storageKey = $storageKey;
	}
	
	/**
	 * Store value in session
	 * @param string $key
	 * @param mixed $value
	 * @return void
	 */
	public function store($key, $value) {
		$sessionData = $this->sessionObject->getSessionData( $this->storageKey );
		$sessionData[$key] = $value;
		$this->sessionObject->setAndSaveSessionData( $this->storageKey, $sessionData );
	}
	
	/**
	 * Delete value in session
	 * @param string $key
	 * @return void
	 */
	public function delete($key) {
		$sessionData = $this->sessionObject->getSessionData( $this->storageKey );
		unset( $sessionData[$key] );
		$this->sessionObject->setAndSaveSessionData( $this->storageKey, $sessionData );
	}
	
	/**
	 * Read value from session
	 * @param string $key
	 * @return mixed
	 */
	public function get($key) {
		$sessionData = $this->sessionObject->getSessionData( $this->storageKey );
		return isset( $sessionData[$key] ) ? $sessionData[$key] : NULL;
	}
}
?>

Eine Wrapper-Class für die Session-Methoden der Backend- und Frontend-User.

Anmerkung: Bisher nur im Backend getestet.

my_ext/Classes/Domain/Session/BackendSessionHandler.php

Code: PHP
<?php
namespace VENDOR\MyExt\Domain\Session;

class BackendSessionHandler extends \VENDOR\MyExt\Domain\Session\SessionHandler {
	/**
	 * @var string
	 */
	protected $mode = "BE";
}
?>

my_ext/Classes/Domain/Session/FrontendSessionHandler.php

Code: PHP
<?php
namespace VENDOR\MyExt\Domain\Session;

class FrontendSessionHandler extends \VENDOR\MyExt\Domain\Session\SessionHandler {
	/**
	 * @var string
	 */
	protected $mode = "FE";
}
?>

my_ext/Classes/Controller/ExampleController.php

Code: PHP
<?php
namespace VENDOR\MyExt\Controller;

class ExampleController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
	
	/**
	 * Backend-Session
	 *
	 * @var \VENDOR\MyExt\Domain\Session\BackendSessionHandler
	 * @inject
	 */
	protected $backendSession;
	
	/**
	 * Frontend-Session
	 *
	 * @var \VENDOR\MyExt\Domain\Session\FrontendSessionHandler
	 * @inject
	 */
	protected $frontendSession;

	/**
	 * Frontend- or Backend-Session
	 * The type of session is set automatically in initializeAction().
	 *
	 * @var \VENDOR\MyExt\Domain\Session\SessionHandler
	 */
	protected $session;

	/**
	 * Example for setting the Session-Storage-Key on every action to keep it unique.
	 * NOTE: This is only an example.
	 * You should decide which kind of session (backend/frontend/automatic) you want to use.
	 * The kind of session should match the Typo3-Mode which this controller is used for.
	 */
	public function initializeAction() {
		// Backend-Session
		$this->backendSession->setStorageKey( $this->request->getControllerExtensionName() . $this->request->getPluginName() );

		// Frontend-Session
		$this->frontendSession->setStorageKey( $this->request->getControllerExtensionName() . $this->request->getPluginName() );

		// Automatic BE/FE-Session
		$this->session = new \VENDOR\MyExt\Domain\Session\SessionHandler(TYPO3_MODE);
		$this->session->setStorageKey( $this->request->getControllerExtensionName() . $this->request->getPluginName() );
	}

	/**
	 * Examples for backend-session.
	 * NOTE: This action should only be called in backend-environment.
	 * Calling this in frontend throws errors because there is not frontend-user!
	 */
	public function myBackendAction() {
		// store a value in session
		$mySessionValue = "Some data to store in session";
		$this->backendSession->store( 'mySessionDataKey', $mySessionValue);

		// get a value from session
		$mySessionValue = $this->backendSession->get( 'mySessionDataKey');

		// remove a value from session
		$this->backendSession->delete( 'mySessionDataKey');
	}

	/**
	 * Examples for frontend-session.
	 * NOTE: This action should only be called in frontend-environment.
	 * Calling this in backend throws errors because there is no backend-user!
	 */
	public function myFrontendAction() {
		// store a value in session
		$mySessionValue = "Some data to store in session";
		$this->frontendSession->store( 'mySessionDataKey', $mySessionValue);

		// get a value from session
		$mySessionValue = $this->frontendSession->get( 'mySessionDataKey');

		// remove a value from session
		$this->frontendSession->delete( 'mySessionDataKey');
	}

	/**
	 * Examples for an action which is called in backend and frontend.
	 */
	public function myActionUsedInBackendAndFrontendAction() {
		// store a value in session
		$mySessionValue = "Some data to store in session";
		$this->session->store( 'mySessionDataKey', $mySessionValue);

		// get a value from session
		$mySessionValue = $this->session->get( 'mySessionDataKey');

		// remove a value from session
		$this->session->delete( 'mySessionDataKey');
	}
}
?>
(1) miki ich schrieb am 17. 7. 2014 um 17:00 Uhr
unter my_ext/Classes/Domain/Session/FrontendSessionHandler.php
steht
<?php
namespace VENDOR\MyExt\Controller;
muss aber
<?php
namespace VENDOR\MyExt\Domain\Session;

und überall bei ... ->store( 'mySessionDataKey', );
eigentlich damit er och etwas speichert ... ->store( 'mySessionDataKey', $mySessionValue );

stehen oder?
(2) marcel schrieb am 17. 7. 2014 um 22:42 Uhr

Hi Miki,

sorry und danke für den Hinweis. Hab’s korrigiert. Das kommt davon wenn man es schnell versucht allgemein zu schreiben und nicht den realen Code postet.

LG Marcel

(3) Johannes C. Schulz schrieb am 27. 3. 2015 um 13:08 Uhr
Hallo
Im Frontend funktioniert es leider nicht (6.2.11). Mir wird getSessionData als unbekannt gemeldet :-(
Auch mußte ich den TYPO3_MODE-Check ausbauen, da dieser immer zur Exeption führte.

Regards
Johannes
(4) Rolf Nakielski schrieb am 27. 5. 2015 um 16:56 Uhr
vertu ich mich oder funktioniert das nur bei eingeloggtem User?
(5) Marcel Briefs schrieb am 27. 5. 2015 um 17:41 Uhr
Hi Rolf,

sorry, habe gerade keine Zeit mir das genauer anzuschauen und zu testen.
In der Art habe ich es im Frontend in einem Webshop unter 6.2.4 in Benutzung. Hier muss niemand angemeldet sein. Die Session-Daten bleiben auch nach einem Login erhalten. Ein anschließendes Abmelden killt dann aber die Session-Daten.
Eventuell hat sich von 6.2.4 auf 6.2.11 etwas am Session-Handling geändert?
Hm, ein 'print_r(get_class_methods($GLOBALS['TSFE']->fe_user));' in der index.php bringt die benutzten Session-Methoden getSessionData() und setAndSaveSessionData() selbst in einer 7.2.0-Installation...
Cookies müssen erlaubt sein. Manchmal bringt auch das gleichzeitige Angemeldet-Sein im Backend oder der Browser-Cache unerwartete Ergebnisse...

LG Marcel