Форма не отображается при использовании токена csrf

Когда onclick нажата функция в Header.vue Я получаю эту ошибку, но когда я удаляю тег ввода с csrf_token из формы в Register.vue, тогда форма регистрации показывает, как и положено.

Хотя после отправки входных данных методом POST у меня остается стандарт 419 (извините, ваш сеанс истек. Пожалуйста, обновите и попробуйте снова.) Экран Laravel.

Я уверен, что экран 419 вызван отсутствием токена CSRF, поэтому мой последний вопрос: как мне реализовать его в vue.js?

Я использую Vue.js и Laravel для создания SPA, в моем компоненте Register.vue, который отображает onclick поверх сайта я добавил токен CSRF следующим образом:

<template>
        <form id="registerForm" class="register-container" action="registerUser" method="post">
      <input type="hidden" name="_token" value="{{ csrf_token() }}">
            <div class="register-container__form">
        <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
          <input class="mdl-textfield__input" name="email" type="text">
          <label class="mdl-textfield__label">Email</label>
        </div>
    .
    .
    .
    </template>

onclick Функция, которая выскакивает регистрационную форму, находится в Header.vue:**

<template>
.
.
.
    <nav class="mdl-navigation">
   <a class="mdl-navigation__link" href="" v-on:click.prevent="registerPopUp()">Sign In</a>
    </nav>

 <register-form/>
</template>

<script>

 import Register from './Register.vue'

 export default {
  components: {
   'register-form': Register
  },
  methods: {
   registerPopUp: () => {
    let loginForm = document.getElementById('loginForm');
    let registerForm = document.getElementById('registerForm');
    loginForm.style.display = "none";
    registerForm.style.display = "block";

    window.onclick = (e) => {
     if(e.target == registerForm)
      registerForm.style.display = "none";
    }
   }
  }
 }
</script>

1 ответ

Да, вы не можете поместить директивы blade в шаблон vue, поэтому ваша форма не рендерится, и вы получаете эту ошибку, вы фактически не выбрали форму, а затем пытаетесь получить доступ к свойству в теме.

Если вы используете axios для отправки запросов к серверу из js, файл resources/js/bootstrap.js по умолчанию зарегистрирует токен csrf с помощью axios, просто убедитесь, что токен csrf все еще размещен в мета-поле вашего макета. как это:

<meta name="csrf-token" content="{{ csrf_token() }}">

Если вы не используете axios, вы можете получить доступ к токену csrf из этого метаполя в JS следующим образом:

let token = document.head.querySelector('meta[name="csrf-token"]');

Если вам действительно нужно это скрытое поле (возможно, вы отправляете форму с помощью обычной кнопки отправки в формате html, а не js), вы можете поместить это в раздел "create ()" компонента vue:

this.csrf_token = document.head.querySelector('meta[name="csrf-token"]');

а затем в вашем шаблоне:

<input type="hidden" name="_token" :value="csrf_token">
Другие вопросы по тегам