Hi Amanda,

I'm interested in this, and I mostly agree with your approach and 
philosophy.

I did some work today trying to move this idea forward, and would propose 
some changes.

First, I'd like to replace the mutable ServerRequestSessionInterface with 
an immutable SessionManagerInterface, which would be responsible for:

   1. opening the session: parsing session cookies and obtaining the stored 
   session data.
   2. committing the session: applying the session cookies and storing the 
   session data.

This seems to be more in tune with PSR-7/15 and makes it obvious how to 
integrate them.
use Psr\Http\Message\ServerRequestInterface; use 
Psr\Http\Message\ResponseInterface; interface SessionManagerInterface { /** 
* Initiates a new session or resumes an existing session based on the 
request context. * * @param ServerRequestInterface $request * * @return 
SessionInterface */ public function open(ServerRequestInterface $request): 
SessionInterface; /** * Commits session data to storage and applies session 
cookies to the response. * * @param SessionInterface $session * @param 
ResponseInterface $response * * @return ResponseInterface */ public 
function commit(SessionInterface $session, ResponseInterface $response): 
ResponseInterface; } 

Secondly, I'd propose some changes to simplify the SessionInterface to 
clarify its role as the bearer session state (and session identifier) and 
simplifying its semantics:

   1. Removing the start and close methods - this is the responsibility of 
   the SessionManagerInterface service, and should happen implicitly.
   2. Removing the getId method - leaving session identifiers as an 
   implementation detail of the SessionManagerInterface service.
   3. Changing the return type of regenerateId from bool to void. (it 
   always returned true.)
   4. Added a getAll method, allowing the session values to be enumerated.
   5. Removed clear in favor of destroy, as these are are ambiguous and can 
   be confusing - to my knowledge, there is no reason you would clear the 
   session data without also destroying the session? If you're clearing the 
   session data anyway, you might as well generate a new session identifier to 
   avoid creating a secuity risk.

interface SessionInterface { /** * Retrieves a session value associated 
with a given key. * * @param string $key * @param mixed $default Default 
value if the session key does not exist. * * @return mixed */ public 
function get(string $key, mixed $default = null): mixed; /** * Sets a 
session value for a given key. * * @param string $key * @param mixed $value 
*/ public function set(string $key, mixed $value): void; /** * Removes a 
session value for a given key. * * @param string $key */ public function 
remove(string $key): void; /** * Checks if the session has a value for the 
given key. * * @param string $key * * @return bool */ public function 
has(string $key): bool; /** * Clears all session data and generates a new 
internal session identifier. */ public function destroy(): void; /** * 
Renew the current session by generating a new internal session identifier. 
*/ public function regenerateId(): void; /** * Returns all session data as 
an associative array. * * @return array */ public function getAll(): array; 
} 

To those who commented with "we don't need this", I would disagree - I 
think there are clear cut use cases for this, starting with stateful 
handlers or middlewares, in particular things like routers or controller 
abstractions that need to store state between requests. I think it's a good 
idea to have a standard way to do this that is compatible with PSR-7/15.

Further more, as Amanda explained, we need this because there is no obvious 
way to use sessions in a PSR-7/15 context. Using $_SESSION creates serious 
problems with testing, and PSR standards do not provide any alternative. 
This is a problem that needs to be solved.

I would point out that a session abstraction doesn't need to cover every 
imaginable use case - and doesn't need to have full parity with every 
existing framework or library out there, and and it should not aim to be a 
replacement for session abstractions in existing frameworks.

Looking at some of the available libraries for session management, 
interfaces like these should work fine (via adapters) for e.g. all of the 
following:

   - 
   
https://github.com/psr7-sessions/storageless/blob/9.2.x/src/Storageless/Session/SessionInterface.php
   - https://github.com/yiisoft/session/blob/master/src/SessionInterface.php
   - 
   https://github.com/mezzio/mezzio-session/blob/1.15.x/src/SessionInterface.php

These libraries aim to replace $_SESSION with a more testable and flexible 
alternative, and I think it's important to have an interface that decouples 
frameworks, middleware, routers, etc. from the implementation - enabling 
the use of session state without having to depend on a specific library.

Amanda, if you're still interested, I'd be happy to join a working group 
and help out. :-)

On Tuesday, September 27, 2022 at 2:40:17 PM UTC+2 Amanda wrote:

> Hi ,
>
> Hope everybody is well in these continued crazy and challenging times.
>
> It would be great to have a PSR for Sessions to complete the other PSRs 
> and fill gaps by not having a standard session interface.
>
> I have attached a document outlining some thoughts and ideas about what i 
> think might be needed and things to be considered based upon my research 
> and testing, which can be used as a starting point for discussion.
>
> It would be amazing if the leading frameworks can come together to write 
> this much needed PSR.
>
> Are there any representatives from frameworks here who are interested in 
> making this happen and backing this? 🙏 
> <https://emojipedia.org/folded-hands/>
>
> Amanda
>

-- 
You received this message because you are subscribed to the Google Groups "PHP 
Framework Interoperability Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to php-fig+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/php-fig/8c3d663b-6269-4d1d-a5f1-1ac996690534n%40googlegroups.com.

Reply via email to