#php #session #model-view-controller
Вопрос:
это класс сеанса в Session.php файл
<?php
namespace appcore;
class Session
{
public function __construct()
{
session_start();
}
public function setFlash($key='', $message='')
{
$_SESSION['flash'][$key] = $message;
}
public function getFlash($key='')
{
return $_SESSION['flash'][$key] ?? false;
}
public function __destruct()
{
unset($_SESSION['flash']);
}
}
затем я вызвал session::setFlash() перед перенаправлением пользователя на домашнюю страницу после регистрации
и вызова session::getFlash() в представлении или макете не имеет значения, но я ничего не отобразил
вот код
public function register(Request $request)
{
$registerModel = new RegisterModel;
if($request->isPost())
{
$registerModel->loadData($request->getBody());
if($registerModel->validate() amp;amp; $registerModel->save())
{
Application::$app->session->setFlash('success', 'Thanks for registering');
$this->redirect('.');
}
return $this->render('register', [
'model' => $registerModel
]);
}
$this->setLayout('auth');
return $this->render('register', [
'model' => $registerModel
]);
}
это тот самый взгляд
<div class="container">
<?php if(Application::$app->session->getFlash('success')):?>
<div class="alert alert-success">
<?php echo Application::$app->session->getFlash('success'); ?>
</div>
<?php endif; ?>
{{content}}
</div>
я не знаю, почему это не работает
Ответ №1:
Два вероятных подозреваемых:
- Вы сбрасываете
'flash'
индекс при уничтожении сеанса. Это означает, что при завершении ОДНОГО запроса (первого) данные очищаются. Я бы рекомендовал вам при вызове удалить определенный ключ из этого массиваgetFlash()
, чтобы каждое сообщение получалось только один раз. - Когда второй запрос уже обработан, но сеанс еще не был записан в хранилище (которое обычно обрабатывается PHP асинхронно), вы можете добавить вызов в
session_write_close()
. Это немедленно завершает сеанс и записывает данные непосредственно в хранилище сеанса, делая их доступными для второго запроса (того, который приходит после перенаправления). Вы должны позвонить по этому номеру, прежде чем делать перенаправление.
Примечание: Ваш «пользовательский MVC-фреймворк» выглядит так, как будто он может жить внутри Laravel. Если это произойдет, redirect()
метод уже может вызвать session_write_close()
, так что мой второй пункт будет спорным.
Комментарии:
1. большое спасибо, это работает, мой брат, это новая информация, которую я узнал от тебя еще раз спасибо
2. @abdallahquapeel Вы всегда можете проголосовать и/или принять ответы, которые решили вашу проблему.
3. ОК, большое спасибо моему бро @Арсен сессии по умолчанию данные хранятся в сессии хранения, но обычно файл, в котором сервер хранит данные сеанса в запертой, и мы будем использовать session_write_close (), чтобы открыть файл, так как я использовал сеанс, перед и не нужна была эта функция, что я прочитал в документации PHP Примечание [ php.net/manual/en/function.session-write-close.php#122035]