2016-06-29 18 views
3

AJAXとVueJsを使用してフォームを送信しようとしています。しかし、どういうわけか私はそれを達成することに失敗しています。私はいつも空のIlluminate\Http\Requestオブジェクトを得ることになります。Laravel 5.1のVueJsとAJAXを使用してフォームを送信

ブレードファイル:

<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でネットワークタブの要求ペイロードのセクションを確認した場合。上記のテキストボックスに書いたデータがあれば、フォームが正常に送信されているのがわかります。

どうしてですか?私が間違っている箇所を親切に案内してくれますか?


UPDATE 1:

私は上記のコードで試行錯誤を遊んでいました。そして、名前空間Illuminate\Http\Requestを削除し、ルートから引数Request $requestも削除しました。そして渡すパラメータをstringからobjectに変更しました。

私が探していた私の仕事はそうでした。なぜ私は知らないのですか?私はまだこれを私に説明できる人を探しています。

名前空間Iluminate\Http\Requestroutes.phpに追加する理由は、私が期待していたとおりに機能しなかったため、タスクが削除されましたか?

なぜ以前にうまくいかなかったのか誰に教えてもらえますか?どのような助けも高く評価されます。


P.S:私は最近VueJsコンポーネントを学び始めている

+0

私はjQuery()。serialize()を試したことがありません。代わりに、Vueコンポーネントにjsonデータオブジェクトを設定し、ポストリクエストとともにそのデータオブジェクトを送信することを好みます。あなたの 'createAdministrator()'で 'this.username'をリクエストデータとして送信し、あなたが得るものを見てください。例えば、 'createAdministrator(){これ。$ http.post( '/ admin'、this.username).then(レスポンス=> {console.log(レスポンス);})' – Donkarnash

+0

@Donkarnash Nope ..それもdidn同じことが起こった..空のオブジェクトを返した.. –

+0

ちょうど勘違い、それを試していない。しかし、.serialize()は "username = WhateverTheInputIs"のような文字列を返しません。あなたが望むのは、{'username':WhateverTheInputIs}のようなオブジェクトを投稿することだと思います。 – Liren

答えて

0

どちらのクラスも__toStringを実装していないので、RequestクラスとSymfonyRequestクラスのすべての変数($ attributes、$ request、$ queryなど)は保護されています。

各値を確認する必要がある場合は、正しいゲッターを呼び出す必要があります。私が従う一般的、laravelコントローラはVUEフロントエンドからJSONオブジェクトとして渡されるに渡す必要のある任意のフォームデータとして

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

'$ request-> all()'は空の配列を返します。 –

+0

JSコードを検査し、ブラウザーでリクエストを確認し、Laravelのサイトをチェックしてくださいhttps://laravel.com/docs/5.1/requests#retrieving-input –

2

:のようなもの。次に、ララベルコントローラ(あなたのケースでクロージャ機能を持つルート)で、受信したjsonオブジェクトの値が$request->get('key')を使って取得されます。
だからあなたの場合にはコンポーネントのコードは、私たちがアクセスする必要が

<?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返し推測あなたのroutes.phpファイルで次に

<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>

可能性があり値はMethods available on Collectionsです。
上記のコードをmain.js'/admin/create'のコードと共にテストしました。
もう1つ - コントローラにシリアライズされたフォームデータを送信し、コントローラー内でデシリアライズする必要がある場合、オブジェクトまたは配列に$key=>$valueのペアを含むデータを取得する必要があります。

+0

あなたはvue.jsをマスターしているようです。あなたの助けが必要です。こちらをご覧ください:http://stackoverflow.com/questions/41843823/how-to-display-button-link-with-vue-js –

関連する問題