使用Laravel 5.1中的VueJs和AJAX提交表单

时间:2016-06-29 08:04:32

标签: php ajax laravel-5.1 vue.js vue-resource

我正在尝试使用AJAX和VueJs提交表单。但不知何故,我未能实现这一目标。我总是得到一个空的Illuminate\Http\Request对象。

刀片文件:

<body>
    <div class="container">
        <generate-admin></generate-admin>
    </div>

    <script src="https:http://code.jquery.com/jquery.js"></script>
    <script src="{{ url('/js/main.js') }}"></script>
</body>

组件:

<template>
    <form id="createAdministrator" @submit.prevent="createAdministrator">

        <div class="form-group">

           <input type="text"
                  name="username"
                  id="txtUserName"
                  placeholder="Username"
                  autocomplete="off"
                  v-model="username"
           />

        </div>

        <input type="submit" value="Submit">

    </form>
</template>

<script>
    export default {
        data: function() {
            return {
                username: ''
            }
        },

        methods: {
            createAdministrator: function() {
                formContents = jQuery("#createAdministrator").serialize();

                this.$http.post('/admin', formContents).then(function(response, status, request) {
                    console.log(response);
                }, function() {
                    console.log('failed');
                });
            }
        }
    }
</script>

main.js

import Vue from 'vue';
import GenerateAdmin from './components/GenerateAdmin.vue';

var VueResource = require('vue-resource')
Vue.use(VueResource);

Vue.http.headers.common['X-CSRF-TOKEN'] = document.querySelector('#token').getAttribute('content');
Vue.http.options.emulateJSON = true;

new Vue({
    el: 'body',

    components: { GenerateAdmin }
});

gulpfile.js

var elixir = require('laravel-elixir');

require('laravel-elixir-vueify');

elixir(function(mix) {
    mix.browserify('main.js');
});

routes.php

Route::get('/admin/create', function () {
    return view('admin.create');
});

Route::post('/admin', function(Request $request) {
    // returns an empty object.
    return response(['results' => $request]);
});

Route::get('/', function () {
    return view('welcome');
});

我得到的回报是:

"{"results":{"attributes":{},"request":{},"query":{},"server":{},"files":{},"cookies":{},"headers":{}}}"

当我检查Chrome中的“网络标签”的“请求有效负载”部分时。我确实看到表单已经成功提交了我在上面的文本框中写的任何数据。

为什么会这样?请指导我在哪里弄错了?

更新1:

我正在使用上面的代码进行试验和错误。我删除了名称空间Illuminate\Http\Request,并从Request $request路由中删除了参数post。并将传递参数从字符串更改为对象。

这样做,为我做了我正在寻找的工作。为什么我不知道。我仍在寻找可以向我解释的人。

为什么在Iluminate\Http\Request文件中添加命名空间routes.php并不像我预期的那样工作并删除它完成了任务?

有谁可以告诉我为什么早些时候没有成功?任何形式的帮助都非常感谢。

P.S。:我最近开始学习VueJs组件。

2 个答案:

答案 0 :(得分:2)

作为我遵循的一般做法,任何需要传递给laravel控制器的表单数据都作为json对象从vue前端传递。然后在laravel控制器(在您的情况下具有闭包功能的路径)中,使用$request->get('key')检索接收到的json对象的值。 因此,在您的情况下,组件代码可能是

    <template>
    <form id="createAdministrator" @submit.prevent="createAdministrator">

        <div class="form-group">

           <input type="text"
                  name="username"
                  id="txtUserName"
                  placeholder="Username"
                  autocomplete="off"
                  v-model="username"
           />

        </div>

        <input type="submit" value="Submit">

    </form>
</template>

<script>
    export default{
      template:require('./generate-admin-template.html'),
      data() {
          return {
              username: ''
          }
      },
      computed:{
        formData(){
          return {
            username:this.username
          }
        }
      },
      methods: {
          createAdministrator: function() {
              this.$http.post('/admin', this.formData).then(function(response) {
                  console.log(response);
              }, function() {
                  console.log('failed');
              });
          }
      }
    }
</script>
  

然后在您的routes.php文件中

<?php
use Illuminate\Http\Request;

/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/

Route::get('/', function () {
    return view('welcome');
});

Route::get('/admin/create', function () {
    return view('admin.create');
});

Route::post('/admin', function (Request $request) {
    return response(['results' => $request->get('username')]);
});  

我想Illuminate\Http\Request实例会返回$request - Collection,因此我们需要使用Methods available on Collections来访问这些值。
我已经测试了上述代码以及main.js'/admin/create'的代码 还有一件事 - 我认为如果您将序列化的表单数据发送到控制器,那么在控制器中需要对其进行反序列化,以便获取包含$key=>$value对的对象或数组,以便于获取所需的数据。

答案 1 :(得分:0)

Request和SymfonyRequest类的所有变量($ attributes,$ request,$ query等)都受到保护,因为这两个类都没有实现__toString,php会尽力为你提供它所能提供的功能。

如果您需要查看每个值,则需要调用正确的getter。类似的东西:

Route::post('/admin', function(Request $request) {    
    return response(['server' => $request->server(), 'form'=>$request->all()]);
});