Я не уверен, что это возможно в Symfony, поэтому я придумал вопрос. Сценарий высокого уровня:
Для целей тестирования я использую два клиента REST для экземпляра браузера:
Вот подход к коду, который я сделал:
Запрос от почтальона:
POST http://path.domain/api/url/
Content-Type: application/json
{
"key": "value"
}
Используя сеанс HTTPFoundation, я установил сеанс:
$session = new Session();
$session->set('session-id', $session->getId());
$session->set('timestamp', time());
Затем верните его, вот ответ:
200 OK
Content-Type: application/json
{
"session-id": "1a69f956b8efc5ab465356e3257a3230",
"timestamp": 1487850859
}
Теперь, чтобы имитировать другой ответ из другого экземпляра, я использую HttpRequester, но с идентификатором session в заголовке:
POST http://path.domain/api/url/
Content-Type: application/json
{
"key": "value",
"session-id": "1a69f956b8efc5ab465356e3257a3230"
}
Имея другой экземпляр запроса, я ожидаю, что Symfony будет генерировать новый сеанс (новое значение временной отметки). Но для моего случая я хотел установить идентификатор сеанса с идентификатором в заголовке запроса, поэтому я могу получить доступ к предыдущей отметке времени, как было возвращено в предыдущем ответе.
Я создал событие ядра, поэтому я могу перехватить запрос и выполнить проверку, если запрос имеет идентификатор сеанса, а затем выполняет настройку сеанса.
// Get all PHP global variables
$request = Request::createFromGlobals();
// Check if the request
if ($request->headers->has('session-id')) {
$session = new Session();
$session->setId($request->headers->get('session-id'));
}
Однако, если я это сделаю, я получаю ошибку:
"error": {
"code": 500,
"message": "Internal Server Error",
"exception": [
{
"message": "Cannot change the ID of an active session",
"class": "LogicException",
...
Что я упустил? Это возможно?
Вы пробовали что-то вроде этого:
if ($request->headers->has('session-id')) {
$session = new Session();
$session->start();
$sess = $session->get('session-id');
$session->set('session-id', $sess);
...
}
Я видел, что в документации есть функция get
, но я обычно не использую сеансы, поэтому я не знаю, будет ли это работать или нет.
Вы можете попробовать?