Я сталкиваюсь со следующей ошибкой в своей новой установке laravel 11
и vue
, когда пытаюсь отправить форму, в данном случае форму регистрации.
419 | Срок действия страницы истек
Я проверил этот вопрос и да, у меня есть @csrf
в моей регистрационной форме и
<meta name = "csrf-token" content = "{{ csrf_token() }}">
Действия по воспроизведению
laravel 11
: composer create-project laravel/laravel test
cd test/
laravel/ui
composer require laravel/ui
php artisan ui vue --auth
Это дало мне предупреждение:
Файл [Controller.php] уже существует. Вы хотите заменить это? (да/нет) [да]
Я набрал yes
, затем [Enter]
npm
и инициализировал vite
npm install && npm run dev
php artisan serve
Редактировать
Там же были сделаны дополнительные шаги repo
. Мы работаем с mongodb
, поэтому также добавили конфигурации Mongodb.
laravel/mongodb
composer require mongodb/laravel-mongodb
config/database.php
, как показано ниже: ...
'mongodb' => [
'driver' => 'mongodb',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', 27017),
'database' => env('DB_DATABASE', 'assets'),
'username' => env('DB_USERNAME', ''),
'password' => env('DB_PASSWORD', ''),
'options' => [
'database' => env('DB_AUTHENTICATION_DATABASE', 'admin'),
],
],
...
DB_CONNECTION=mongodb
DB_HOST=127.0.0.1
DB_PORT=27017
DB_DATABASE=testdb
DB_USERNAME=
DB_PASSWORD=
...
Я надеюсь, что есть кто-то с решением.
Обратите внимание: я попробовал установить laravel 10
и выполнить те же процессы, и все работает отлично. Что изменилось в laravel 11
? Любая помощь приветствуется.
Редактировать
Ниже содержимое моего bootstrap/app.php
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
//
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
и register.blade.php
<form method = "POST" action = "{{ route('register') }}">
@csrf
<div class = "row mb-3">
// Rest of code
Я добавил содержимое в вопрос. И еще, как ты получил новую установку? Используя эту команду: composer create-project laravel/laravel test
Да, я только что скопировал команды из ваших вопросов, и все они сработали нормально. В любом случае файл boostrap/app.php мне кажется хорошим. Хорошо, давайте попробуем что-нибудь еще: проверим файл .env
и посмотрим на переменную SESSION_LIFETIME
. Установлено ли 0
?
Нет, это 120: SESSION_LIFETIME=120
@EyadBereh Я добавил некоторую информацию, которой у меня раньше не было. При использовании sqlite
(по умолчанию в Laravel 11) он работает, но когда я добавил установку mongodb, возникает ошибка.
Я добавил фрагмент register.blade.php
, где инициализирую форму регистрации. Это страница регистрации по умолчанию, я не вносил в нее никаких изменений.
Проблема здесь, очевидно, как-то связана с MongoDB (о которой я ничего не знаю). Попробуйте переключить переменную SESSION_DRIVER
на file
вместо значения по умолчанию database
.
Если база данных используется по умолчанию, просто убедитесь, что вы создали для нее таблицу. php artisan session:table --connection=mongodb
На это же указывает и ошибка. Он не может сохранять сеансы, поэтому каждый запрос получает новый сеанс, но это означает, что даже если он получил токен CSRF, соответствующий предыдущему сеансу, он больше не соответствует новому.
@EyadBereh Это ответ. Когда я переключил SESSION_DRIVER=file
, все заработало отлично. Вы должны указать это как ответ, чтобы я проголосовал за него, потому что кто-то еще застрял на этом.
Привет, у меня возникла проблема с laravel 10. Мне очень хотелось бы понять, почему это происходит. Почему я не могу использовать базу данных в качестве драйвера сеанса? ты это понял?
Идея заключалась в том, что если вы хотите использовать SESSION_DRIVER: database
, то сначала запустите php artisan migrate
.
Хотя в вопросе об этом прямо не упоминается, я полагаю, что вы также переключили базу данных по умолчанию на MongoDB.
Поскольку это было настроено таким образом после установки, может потребоваться повторно создать таблицу для сеанса.
В Laravel 11 эта команда автоматически выполнялась бы php artisan migrate
, но она выполнялась до установки MongoDB. Я предполагаю, что после перехода на новую базу данных вам придется повторно запустить команду migrate
отдельно. В противном случае вручную можно создать только таблицу сеансов.
php artisan make:session-table
Это также приемлемый ответ. Я не запускал команду php artisan migrate
.
Похоже, вы используете драйвер database
в качестве драйвера сеанса. Это значение по умолчанию, начиная с Laravel 11.
Я уверен, что эта проблема как-то связана с MongoDB, но я бы посоветовал вам использовать драйвер сеанса file
. Вы можете сделать это, установив для переменной SESSION_DRIVER
внутри вашего .env
файла значение file
:
SESSION_DRIVER=file
В любом случае, в вашем случае я не понимаю, почему вам нужно использовать базу данных для хранения ваших сеансов. Использование файловой системы происходит намного быстрее и требует гораздо меньших затрат.
Начиная с Laravel 11, использование базы данных стало стандартным. Конфигурация сессии Сначала я не понял, в чем проблема... Я все еще имел в виду старые параметры. Кстати, не могли бы вы предоставить некоторую информацию о том, почему вы рекомендуете использовать именно файлы? Просто оставьте комментарий здесь, если есть хорошая статья или краткое изложение об этом, мне было бы интересно узнать больше.
@rozsazoltan Я предложил использовать файловую систему в качестве драйвера для хранения сеансов, потому что операции чтения/записи файлов выполняются быстрее, чем те, что происходят с базой данных, а также давайте не будем забывать, что с каждым входящим запросом сервер извлекает данные сеанса, поэтому так и будет не лучше ли получать данные из файловой системы, а не из базы данных.
@rozsazoltan Здесь я хотел бы упомянуть еще одну вещь: вы взаимодействуете с сеансами через помощник session()
, чтобы получить нужные данные, и вам не важно, хранятся ли они в красивой таблице базы данных или в беспорядке. файл, для вас это не имеет значения, вы просто получаете свои данные, и это все, что имеет значение.
База данных @rozsazoltan в качестве хранилища сеансов может быть полезна в таких сценариях, когда сеанс может использоваться несколькими внешними интерфейсами, но вы все равно можете настроить для этой цели кластер Redis, он работает очень быстро и обеспечивает лучшую масштабируемость.
Спасибо, что поделились своим мнением и точкой зрения! Очень полезно изучить функциональность с разных точек зрения. Теперь я полностью согласен с вашим комментарием о том, что для очень простого небольшого проекта использования файлов может быть достаточно и даже лучше. Однако если необходима балансировка нагрузки или лучшая масштабируемость, рекомендуется плавно перейти к базе данных или настроить Redis или Memcache для гораздо большей производительности.
@rozsazoltan Всегда пожалуйста! Я рад видеть, что здесь, на Stack Overflow, есть хорошие люди, которые готовы обсуждать и говорить, а не просто голосовать против.
Это странно, я попробовал это на новой установке Laravel 11 и не столкнулся с той же проблемой. Я попробовал те же шаги, что и в вашем вопросе. Не могли бы вы обновить свой вопрос содержимым вашего
bootstrap/app.php
файла?