wadigchan
@wadigchan

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

axiosを使ってコントローラにPOSTすることができない。

解決したいこと

laravelを使ったブログサイトを作っています。
ブログのタイトルや内容などをaxiosを使ってvueからコントローラに送ることができません。
デベロッパーツールでコンソールやネットワークを確認すると内容自体はちゃんと送られてきているのですが、
コントローラの方でdd($request->all());をやっても何も届いていません。

発生している問題・エラー

エラーは出ていません。

該当するソースコード

create.blade.php
@extends('layouts.app')

@section('content')

<div class="card-header">新規投稿</div>
<div class="card-body">
  @if (session('status'))
  <div class="alert alert-success" role="alert">
    {{ session('status') }}
  </div>
  @endif

  <div class="card">
    <div class="card-body">
      @if ($errors->any())
      <div class="alert alert-danger">
        <ul>
          @foreach ($errors->all() as $error)
          <li>{{ $error }}</li>
          @endforeach
        </ul>
      </div>
      @end 

        <div class="form-group" id="app">
          <markdown-component></markdown-component>
        </div>

    </div>
  </div>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>

@endsection

MarkdownComponent.vue
<template>
    <div>
        <div class="form-group">
            <label for="exampleInputEmail1">タイトル</label>
            <input
                type="text"
                class="form-control"
                id="exampleInputEmail1"
                placeholder="title"
                name="title"
                v-model="title"
            />
        </div>

        <div class="form-group">
            <label for="exampleInputEmail1">カテゴリ</label>
            <input
                type="text"
                class="form-control"
                placeholder="category"
                name="tagCategory"
                v-model="tagCategory"
            />
        </div>

        <div class="form-group" id="file-preview">
            <label for="exampleFormControlFile1">サムネイル</label>
            <input
                type="file"
                ref="file"
                class="form-control-file"
                id="exampleFormControlFile1"
                name="image"
                accept="image/*"
                v-on:change="onFileChange"
            />
            <img
                class="userInfo__icon"
                v-bind:src="imageData"
                v-if="imageData"
                style="width: 270px"
            />
            <button
                class="btn btn-danger"
                v-if="imageData"
                @click="resetFile()"
            >
                削除
            </button>
        </div>

        <div class="form-group">
            <p>本文</p>
            <editor ref="toastuiEditor" />
        </div>

        <div class="form-group">
            <label for="exampleFormControlSelect1">公開設定</label>
            <select
                input
                type="id"
                id="exampleFormControlSelect1"
                name="is_published"
                v-model="is_published"
            >
                <option value="1">公開</option>
                <option value="0">非公開</option>
            </select>
        </div>

        <a href="/posts" class="btn btn-primary" @click="getHTML">DD</a>
        <a href="/" class="btn btn-primary">キャンセル</a>
    </div>
</template>

<script>
import "codemirror/lib/codemirror.css";
import "@toast-ui/editor/dist/toastui-editor.css";
import { Editor } from "@toast-ui/vue-editor";

export default {
    name: "MarkdownComponent",
    components: {
        editor: Editor,
    },
    data() {
        return {
            title: "",
            tagCategory: "",
            is_published: "",
            content:"",
            imageData: "", 
        };
    },
    methods: {
        scroll() {
            this.$refs.toastuiEditor.invoke("setScrollTop", 10);
        },
        moveTop() {
            this.$refs.toastuiEditor.invoke("moveCursorToStart");
        },
        getHTML() {
            let HTML = this.$refs.toastuiEditor.invoke("getHTML");

            axios
                .post("/posts",{
                    title: this.title,
                    tagCategory: this.tagCategory,
                    content: HTML,
                    is_published: this.is_published,
                    imageData:this.imageData,
                })
                .then((res) => {
                    console.log(res);
                    this.posts = res.data.posts;
                })
                .catch((err) => {
                    console.log(err);
                });
        },

        onFileChange(e) {
            const files = e.target.files;
            if (files.length > 0) {
                const file = files[0];
                const reader = new FileReader();
                reader.onload = (e) => {
                    this.imageData = e.target.result;
                };
                reader.readAsDataURL(file);
            }
        },
        resetFile() {
            const input = this.$refs.file;
            input.type = "text";
            input.type = "file";
            this.imageData = "";
        },
    },
};
</script>

自分で試したこと

なんだか見当違いなことをしている気がしています。形式などが違うのでしょうか?

0

1Answer

デベロッパーツールで送信が確認できているなら、レスポンスも確認できると思います。
レスポンスは何が返ってきているでしょうか?

リクエストしているURL、メソッドはrouteで設定されていますか?
コマンドでrouteを確認することができます。

php artisan route:list

WebサーバのアクセスログやLaravelのアプリケーションログに何か残されていないですか?

1Like

Comments

  1. @wadigchan

    Questioner

    いつもありがとうございます。
    routeは、
    Route::resource('/posts', 'App\Http\Controllers\PostController', ['except' => ['index']]);
    で設定してます。
    php artisan route:listは、
    POST | posts | posts.store |App\Http\Controllers\PostController@store | web
    となっています。
  2. @wadigchan

    Questioner

    長いですが、レスポンスはこのような感じです。

    <script> Sfdump = window.Sfdump || (function (doc) { var refStyle = doc.createElement('style'), rxEsc = /([.*+?^${}()|\[\]\/\\])/g, idRx = /\bsf-dump-\d+-ref[012]\w+\b/, keyHint = 0 <= navigator.platform.toUpperCase().indexOf('MAC') ? 'Cmd' : 'Ctrl', addEventListener = function (e, n, cb) { e.addEventListener(n, cb, false); }; refStyle.innerHTML = 'pre.sf-dump .sf-dump-compact, .sf-dump-str-collapse .sf-dump-str-collapse, .sf-dump-str-expand .sf-dump-str-expand { display: none; }'; (doc.documentElement.firstElementChild || doc.documentElement.children[0]).appendChild(refStyle); refStyle = doc.createElement('style'); (doc.documentElement.firstElementChild || doc.documentElement.children[0]).appendChild(refStyle); if (!doc.addEventListener) { addEventListener = function (element, eventName, callback) { element.attachEvent('on' + eventName, function (e) { e.preventDefault = function () {e.returnValue = false;}; e.target = e.srcElement; callback(e); }); }; } function toggle(a, recursive) { var s = a.nextSibling || {}, oldClass = s.className, arrow, newClass; if (/\bsf-dump-compact\b/.test(oldClass)) { arrow = '&#9660;'; newClass = 'sf-dump-expanded'; } else if (/\bsf-dump-expanded\b/.test(oldClass)) { arrow = '&#9654;'; newClass = 'sf-dump-compact'; } else { return false; } if (doc.createEvent && s.dispatchEvent) { var event = doc.createEvent('Event'); event.initEvent('sf-dump-expanded' === newClass ? 'sfbeforedumpexpand' : 'sfbeforedumpcollapse', true, false); s.dispatchEvent(event); } a.lastChild.innerHTML = arrow; s.className = s.className.replace(/\bsf-dump-(compact|expanded)\b/, newClass); if (recursive) { try { a = s.querySelectorAll('.'+oldClass); for (s = 0; s < a.length; ++s) { if (-1 == a[s].className.indexOf(newClass)) { a[s].className = newClass; a[s].previousSibling.lastChild.innerHTML = arrow; } } } catch (e) { } } return true; }; function collapse(a, recursive) { var s = a.nextSibling || {}, oldClass = s.className; if (/\bsf-dump-expanded\b/.test(oldClass)) { toggle(a, recursive); return true; } return false; }; function expand(a, recursive) { var s = a.nextSibling || {}, oldClass = s.className; if (/\bsf-dump-compact\b/.test(oldClass)) { toggle(a, recursive); return true; } return false; }; function collapseAll(root) { var a = root.querySelector('a.sf-dump-toggle'); if (a) { collapse(a, true); expand(a); return true; } return false; } function reveal(node) { var previous, parents = []; while ((node = node.parentNode || {}) && (previous = node.previousSibling) && 'A' === previous.tagName) { parents.push(previous); } if (0 !== parents.length) { parents.forEach(function (parent) { expand(parent); }); return true; } return false; } function highlight(root, activeNode, nodes) { resetHighlightedNodes(root); Array.from(nodes||[]).forEach(function (node) { if (!/\bsf-dump-highlight\b/.test(node.className)) { node.className = node.className + ' sf-dump-highlight'; } }); if (!/\bsf-dump-highlight-active\b/.test(activeNode.className)) { activeNode.className = activeNode.className + ' sf-dump-highlight-active'; } } function resetHighlightedNodes(root) { Array.from(root.querySelectorAll('.sf-dump-str, .sf-dump-key, .sf-dump-public, .sf-dump-protected, .sf-dump-private')).forEach(function (strNode) { strNode.className = strNode.className.replace(/\bsf-dump-highlight\b/, ''); strNode.className = strNode.className.replace(/\bsf-dump-highlight-active\b/, ''); }); } return function (root, x) { root = doc.getElementById(root); var indentRx = new RegExp('^('+(root.getAttribute('data-indent-pad') || ' ').replace(rxEsc, '\\$1')+')+', 'm'), options = {"maxDepth":1,"maxStringLength":160,"fileLinkFormat":false}, elt = root.getElementsByTagName('A'), len = elt.length, i = 0, s, h, t = []; while (i < len) t.push(elt[i++]); for (i in x) { options[i] = x[i]; } function a(e, f) { addEventListener(root, e, function (e, n) { if ('A' == e.target.tagName) { f(e.target, e); } else if ('A' == e.target.parentNode.tagName) { f(e.target.parentNode, e); } else { n = /\bsf-dump-ellipsis\b/.test(e.target.className) ? e.target.parentNode : e.target; if ((n = n.nextElementSibling) && 'A' == n.tagName) { if (!/\bsf-dump-toggle\b/.test(n.className)) { n = n.nextElementSibling || n; } f(n, e, true); } } }); }; function isCtrlKey(e) { return e.ctrlKey || e.metaKey; } function xpathString(str) { var parts = str.match(/[^'"]+|['"]/g).map(function (part) { if ("'" == part) { return '"\'"'; } if ('"' == part) { return "'\"'"; } return "'" + part + "'"; }); return "concat(" + parts.join(",") + ", '')"; } function xpathHasClass(className) { return "contains(concat(' ', normalize-space(@class), ' '), ' " + className +" ')"; } addEventListener(root, 'mouseover', function (e) { if ('' != refStyle.innerHTML) { refStyle.innerHTML = ''; } }); a('mouseover', function (a, e, c) { if (c) { e.target.style.cursor = "pointer"; } else if (a = idRx.exec(a.className)) { try { refStyle.innerHTML = 'pre.sf-dump .'+a[0]+'{background-color: #B729D9; color: #FFF !important; border-radius: 2px}'; } catch (e) { } } }); a('click', function (a, e, c) { if (/\bsf-dump-toggle\b/.test(a.className)) { e.preventDefault(); if (!toggle(a, isCtrlKey(e))) { var r = doc.getElementById(a.getAttribute('href').substr(1)), s = r.previousSibling, f = r.parentNode, t = a.parentNode; t.replaceChild(r, a); f.replaceChild(a, s); t.insertBefore(s, r); f = f.firstChild.nodeValue.match(indentRx); t = t.firstChild.nodeValue.match(indentRx); if (f && t && f[0] !== t[0]) { r.innerHTML = r.innerHTML.replace(new RegExp('^'+f[0].replace(rxEsc, '\\$1'), 'mg'), t[0]); } if (/\bsf-dump-compact\b/.test(r.className)) { toggle(s, isCtrlKey(e)); } } if (c) { } else if (doc.getSelection) { try { doc.getSelection().removeAllRanges(); } catch (e) { doc.getSelection().empty(); } } else { doc.selection.empty(); } } else if (/\bsf-dump-str-toggle\b/.test(a.className)) { e.preventDefault(); e = a.parentNode.parentNode; e.className = e.className.replace(/\bsf-dump-str-(expand|collapse)\b/, a.parentNode.className); } }); elt = root.getElementsByTagName('SAMP'); len = elt.length; i = 0; while (i < len) t.push(elt[i++]); len = t.length; for (i = 0; i < len; ++i) { elt = t[i]; if ('SAMP' == elt.tagName) { a = elt.previousSibling || {}; if ('A' != a.tagName) { a = doc.createElement('A'); a.className = 'sf-dump-ref'; elt.parentNode.insertBefore(a, elt); } else { a.innerHTML += ' '; } a.title = (a.title ? a.title+'\n[' : '[')+keyHint+'+click] Expand all children'; a.innerHTML += elt.className == 'sf-dump-compact' ? '<span>&#9654;</span>' : '<span>&#9660;</span>'; a.className += ' sf-dump-toggle'; x = 1; if ('sf-dump' != elt.parentNode.className) { x += elt.parentNode.getAttribute('data-depth')/1; } } else if (/\bsf-dump-ref\b/.test(elt.className) && (a = elt.getAttribute('href'))) { a = a.substr(1); elt.className += ' '+a; if (/[\[{]$/.test(elt.previousSibling.nodeValue)) { a = a != elt.nextSibling.id && doc.getElementById(a); try { s = a.nextSibling; elt.appendChild(a); s.parentNode.insertBefore(a, s); if (/^[@#]/.test(elt.innerHTML)) { elt.innerHTML += ' <span>&#9654;</span>'; } else { elt.innerHTML = '<span>&#9654;</span>'; elt.className = 'sf-dump-ref'; } elt.className += ' sf-dump-toggle'; } catch (e) { if ('&' == elt.innerHTML.charAt(0)) { elt.innerHTML = '&hellip;'; elt.className = 'sf-dump-ref'; } } } } } if (doc.evaluate && Array.from && root.children.length > 1) { root.setAttribute('tabindex', 0); SearchState = function () { this.nodes = []; this.idx = 0; }; SearchState.prototype = { next: function () { if (this.isEmpty()) { return this.current(); } this.idx = this.idx < (this.nodes.length - 1) ? this.idx + 1 : 0; return this.current(); }, previous: function () { if (this.isEmpty()) { return this.current(); } this.idx = this.idx > 0 ? this.idx - 1 : (this.nodes.length - 1); return this.current(); }, isEmpty: function () { return 0 === this.count(); }, current: function () { if (this.isEmpty()) { return null; } return this.nodes[this.idx]; }, reset: function () { this.nodes = []; this.idx = 0; }, count: function () { return this.nodes.length; }, }; function showCurrent(state) { var currentNode = state.current(), currentRect, searchRect; if (currentNode) { reveal(currentNode); highlight(root, currentNode, state.nodes); if ('scrollIntoView' in currentNode) { currentNode.scrollIntoView(true); currentRect = currentNode.getBoundingClientRect(); searchRect = search.getBoundingClientRect(); if (currentRect.top < (searchRect.top + searchRect.height)) { window.scrollBy(0, -(searchRect.top + searchRect.height + 5)); } } } counter.textContent = (state.isEmpty() ? 0 : state.idx + 1) + ' of ' + state.count(); } var search = doc.createElement('div'); search.className = 'sf-dump-search-wrapper sf-dump-search-hidden'; search.innerHTML = ' <input type="text" class="sf-dump-search-input"> <span class="sf-dump-search-count">0 of 0<\/span> <button type="button" class="sf-dump-search-input-previous" tabindex="-1"> <svg viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1683 1331l-166 165q-19 19-45 19t-45-19L896 965l-531 531q-19 19-45 19t-45-19l-166-165q-19-19-19-45.5t19-45.5l742-741q19-19 45-19t45 19l742 741q19 19 19 45.5t-19 45.5z"\/><\/svg> <\/button> <button type="button" class="sf-dump-search-input-next" tabindex="-1"> <svg viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1683 808l-742 741q-19 19-45 19t-45-19L109 808q-19-19-19-45.5t19-45.5l166-165q19-19 45-19t45 19l531 531 531-531q19-19 45-19t45 19l166 165q19 19 19 45.5t-19 45.5z"\/><\/svg> <\/button> '; root.insertBefore(search, root.firstChild); var state = new SearchState(); var searchInput = search.querySelector('.sf-dump-search-input'); var counter = search.querySelector('.sf-dump-search-count'); var searchInputTimer = 0; var previousSearchQuery = ''; addEventListener(searchInput, 'keyup', function (e) { var searchQuery = e.target.value; /* Don't perform anything if the pressed key didn't change the query */ if (searchQuery === previousSearchQuery) { return; } previousSearchQuery = searchQuery; clearTimeout(searchInputTimer); searchInputTimer = setTimeout(function () { state.reset(); collapseAll(root); resetHighlightedNodes(root); if ('' === searchQuery) { counter.textContent = '0 of 0'; return; } var classMatches = [ "sf-dump-str", "sf-dump-key", "sf-dump-public", "sf-dump-protected", "sf-dump-private", ].map(xpathHasClass).join(' or '); var xpathResult = doc.evaluate('.//span[' + classMatches + '][contains(translate(child::text(), ' + xpathString(searchQuery.toUpperCase()) + ', ' + xpathString(searchQuery.toLowerCase()) + '), ' + xpathString(searchQuery.toLowerCase()) + ')]', root, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); while (node = xpathResult.iterateNext()) state.nodes.push(node); showCurrent(state); }, 400); }); Array.from(search.querySelectorAll('.sf-dump-search-input-next, .sf-dump-search-input-previous')).forEach(function (btn) { addEventListener(btn, 'click', function (e) { e.preventDefault(); -1 !== e.target.className.indexOf('next') ? state.next() : state.previous(); searchInput.focus(); collapseAll(root); showCurrent(state); }) }); addEventListener(root, 'keydown', function (e) { var isSearchActive = !/\bsf-dump-search-hidden\b/.test(search.className); if ((114 === e.keyCode && !isSearchActive) || (isCtrlKey(e) && 70 === e.keyCode)) { /* F3 or CMD/CTRL + F */ if (70 === e.keyCode && document.activeElement === searchInput) { /* * If CMD/CTRL + F is hit while having focus on search input, * the user probably meant to trigger browser search instead. * Let the browser execute its behavior: */ return; } e.preventDefault(); search.className = search.className.replace(/\bsf-dump-search-hidden\b/, ''); searchInput.focus(); } else if (isSearchActive) { if (27 === e.keyCode) { /* ESC key */ search.className += ' sf-dump-search-hidden'; e.preventDefault(); resetHighlightedNodes(root); searchInput.value = ''; } else if ( (isCtrlKey(e) && 71 === e.keyCode) /* CMD/CTRL + G */ || 13 === e.keyCode /* Enter */ || 114 === e.keyCode /* F3 */ ) { e.preventDefault(); e.shiftKey ? state.previous() : state.next(); collapseAll(root); showCurrent(state); } } }); } if (0 >= options.maxStringLength) { return; } try { elt = root.querySelectorAll('.sf-dump-str'); len = elt.length; i = 0; t = []; while (i < len) t.push(elt[i++]); len = t.length; for (i = 0; i < len; ++i) { elt = t[i]; s = elt.innerText || elt.textContent; x = s.length - options.maxStringLength; if (0 < x) { h = elt.innerHTML; elt[elt.innerText ? 'innerText' : 'textContent'] = s.substring(0, options.maxStringLength); elt.className += ' sf-dump-str-collapse'; elt.innerHTML = '<span class=sf-dump-str-collapse>'+h+'<a class="sf-dump-ref sf-dump-str-toggle" title="Collapse"> &#9664;</a></span>'+ '<span class=sf-dump-str-expand>'+elt.innerHTML+'<a class="sf-dump-ref sf-dump-str-toggle" title="'+x+' remaining characters"> &#9654;</a></span>'; } } } catch (e) { } }; })(document); </script><style> pre.sf-dump { display: block; white-space: pre; padding: 5px; overflow: initial !important; } pre.sf-dump:after { content: ""; visibility: hidden; display: block; height: 0; clear: both; } pre.sf-dump span { display: inline; } pre.sf-dump a { text-decoration: none; cursor: pointer; border: 0; outline: none; color: inherit; } pre.sf-dump img { max-width: 50em; max-height: 50em; margin: .5em 0 0 0; padding: 0; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAHUlEQVQY02O8zAABilCaiQEN0EeA8QuUcX9g3QEAAjcC5piyhyEAAAAASUVORK5CYII=) #D3D3D3; } pre.sf-dump .sf-dump-ellipsis { display: inline-block; overflow: visible; text-overflow: ellipsis; max-width: 5em; white-space: nowrap; overflow: hidden; vertical-align: top; } pre.sf-dump .sf-dump-ellipsis+.sf-dump-ellipsis { max-width: none; } pre.sf-dump code { display:inline; padding:0; background:none; } .sf-dump-public.sf-dump-highlight, .sf-dump-protected.sf-dump-highlight, .sf-dump-private.sf-dump-highlight, .sf-dump-str.sf-dump-highlight, .sf-dump-key.sf-dump-highlight { background: rgba(111, 172, 204, 0.3); border: 1px solid #7DA0B1; border-radius: 3px; } .sf-dump-public.sf-dump-highlight-active, .sf-dump-protected.sf-dump-highlight-active, .sf-dump-private.sf-dump-highlight-active, .sf-dump-str.sf-dump-highlight-active, .sf-dump-key.sf-dump-highlight-active { background: rgba(253, 175, 0, 0.4); border: 1px solid #ffa500; border-radius: 3px; } pre.sf-dump .sf-dump-search-hidden { display: none !important; } pre.sf-dump .sf-dump-search-wrapper { font-size: 0; white-space: nowrap; margin-bottom: 5px; display: flex; position: -webkit-sticky; position: sticky; top: 5px; } pre.sf-dump .sf-dump-search-wrapper > * { vertical-align: top; box-sizing: border-box; height: 21px; font-weight: normal; border-radius: 0; background: #FFF; color: #757575; border: 1px solid #BBB; } pre.sf-dump .sf-dump-search-wrapper > input.sf-dump-search-input { padding: 3px; height: 21px; font-size: 12px; border-right: none; border-top-left-radius: 3px; border-bottom-left-radius: 3px; color: #000; min-width: 15px; width: 100%; } pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-next, pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-previous { background: #F2F2F2; outline: none; border-left: none; font-size: 0; line-height: 0; } pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-next { border-top-right-radius: 3px; border-bottom-right-radius: 3px; } pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-next > svg, pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-previous > svg { pointer-events: none; width: 12px; height: 12px; } pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-count { display: inline-block; padding: 0 5px; margin: 0; border-left: none; line-height: 21px; font-size: 12px; }pre.sf-dump, pre.sf-dump .sf-dump-default{background-color:#18171B; color:#FF8400; line-height:1.2em; font:12px Menlo, Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:99999; word-break: break-all}pre.sf-dump .sf-dump-num{font-weight:bold; color:#1299DA}pre.sf-dump .sf-dump-const{font-weight:bold}pre.sf-dump .sf-dump-str{font-weight:bold; color:#56DB3A}pre.sf-dump .sf-dump-note{color:#1299DA}pre.sf-dump .sf-dump-ref{color:#A0A0A0}pre.sf-dump .sf-dump-public{color:#FFFFFF}pre.sf-dump .sf-dump-protected{color:#FFFFFF}pre.sf-dump .sf-dump-private{color:#FFFFFF}pre.sf-dump .sf-dump-meta{color:#B729D9}pre.sf-dump .sf-dump-key{color:#56DB3A}pre.sf-dump .sf-dump-index{color:#1299DA}pre.sf-dump .sf-dump-ellipsis{color:#FF8400}pre.sf-dump .sf-dump-ns{user-select:none;}pre.sf-dump .sf-dump-ellipsis-note{color:#1299DA}</style><pre class=sf-dump id=sf-dump-1841681790 data-indent-pad=" "><span class=sf-dump-note>array:5</span> [<samp data-depth=1 class=sf-dump-expanded>
    "<span class=sf-dump-key>title</span>" => "<span class=sf-dump-str title="4 characters">&#12479;&#12452;&#12488;&#12523;</span>"
    "<span class=sf-dump-key>tagCategory</span>" => "<span class=sf-dump-str title="4 characters">&#12459;&#12486;&#12468;&#12522;</span>"
    "<span class=sf-dump-key>content</span>" => "<span class=sf-dump-str title="21 characters">&lt;p&gt;&#26412;&#25991;&#26412;&#25991;&#26412;&#25991;&#26412;&#25991;&#26412;&#25991;&#26412;&#25991;&#26412;&#25991;&lt;/p&gt;</span>"
    "<span class=sf-dump-key>is_published</span>" => "<span class=sf-dump-str>1</span>"
    "<span class=sf-dump-key>imageData</span>" => <span class=sf-dump-const>null</span>
    </samp>]
    </pre><script>Sfdump("sf-dump-1841681790")</script>
  3. 分かりにくいのですが、このレスポンスは"dd($request->all())"の結果ではないでしょうか?
    「title」「tagCategory」「content」「is_published」「imageData」といったキーワードが見られるので何かしらは届いていそうですが。
  4. @wadigchan

    Questioner

    まだaxiosでpost送信を成功させたことがないので分からないのですが、成功した場合は、dd($request->all());で、/postsのページ上に「title」「tagCategory」「content」「is_published」「imageData」の内容が表示されるのですか?
  5. 「期待するコントローラーのアクションが処理され、パラメータが受け取れている」というのを成功とするのであれば、
    dd($request->all())の結果が返され、内容から送信したパラメータが確認できれば成功だと思います。

    ajaxなので直接画面に表示されるものではないですが、レスポンスとして確認できます。
    $request->all()の結果が分かりにくければ、$request->input('title')などで個別に確認するのも良いと思います。
  6. @wadigchan

    Questioner

    今気づいたのですが、
    <button type="button" @click="getHTML">送信</button>
    このボタンだと、test.blade.phpのページのままコンソールだけ更新されてネットワークのレスポンスが確認できるのですが(さっき送ったレスポンスがそれです)、
    質問記事で書いてある
    <a href="/posts" class="btn btn-primary" @click="getHTML">DD</a>
    これだと"/posts"のページ上でネットワークにpostが届いてる確認はできていなかったです。
    代わりにGETのpostが取得されていました。
  7. おそらくですが、JavaScriptからPOST送信しているのと、aタグからGET送信しているのを混同されているのではないかと思います。

    aタグをイベントのトリガにする場合、通常の画面遷移する動作が不要になったりするので、そういう時はその動作を無効にする必要があります。
    よく使われるのはhref属性を`#`や`javascript:void(0)`にする方法です。
    <a href="#">
    <a href="javascript:void(0)">

    aタグをクリックして遷移するのはGETメソッドになるので、POSTメソッド限定のposts.storeでは処理されないです。
  8. @wadigchan

    Questioner

    postsのページに飛ぶ際のGET送信と、jsからのPOST送信が重なっているため、axiosで送信した内容がコントローラに届かないということですか?

    <a href="javascript:void(0)" class="btn btn-primary" @click="getHTML">DD</a>
    例えばこのように書き換えた場合、"/posts"に飛ぶ命令はvueから、
    window.location = "/posts";
    これを書いて飛ばすということですか??
  9. > axiosで送信した内容がコントローラに届かないということですか?

    いえ、片方のリクエストが消えるようなことはありません。
    「コントローラの方でdd($request->all());をやっても何も届いていません」というのは、GET送信の結果を見ているのではないかと思いました。

    > "/posts"に飛ぶ命令はvueから、

    `axios.post("/posts")`がそれです。


    axiosは画面を移動せずにリクエストを行うものです。
    (例えばここのコメント送信のようなことが出来ます)
    画面を移動するのであればaxiosを使わず、formタグでPOSTすればよいです。
  10. @wadigchan

    Questioner

    確かにその通りでした、、僕がずっとコントローラのddで確認していた内容はGETの内容だったんですね。

    僕は投稿ボタンを押したら、axiosから/postsにブログ内容が送られ、そこからコントローラに渡りデータベースに保存されブログ投稿が完了し、トップページに自動遷移するという動きを作りたいのですが、まずコントローラのdd($request->all());でPOST内容が確認できるようにするには何をすればいいのでしょうか、、?

    マークダウンエディタに入力したブログ本文の内容は、ライブラリを使っているためvue側じゃないと取得できないので、他のタイトルやカテゴリも一緒にvue側で取得して、axiosからまとめてコントローラに送るというのが僕の実現させたいことです。

    そのためformを使うとformとaxiosの二重送信になってしまうため、formタグのPOSTを使っていませんでした。
  11. > コントローラのdd($request->all());でPOST内容が確認できるようにするには何をすればいいのでしょうか、、?

    レスポンスはデベロッパーツールから確認できます。
    おそらく最初の方に添付していただいたレスポンスがそれだと思います。
    もしくはthen()のres.dataに入っていると思います。

    axios.post("/posts",{})
    .then((res) => {
    })

    https://github.com/axios/axios#response-schema

    ただこの場合はdd()だと分かりにくいと思うので、ログに書き込んでみるのも良いかもしれません。

    例)
    use Illuminate\Support\Facades\Log;
    Log::debug('request all', $request->all());

    https://readouble.com/laravel/8.x/ja/logging.html#writing-log-messages
  12. @wadigchan

    Questioner

    すみません、僕はとても見当違いなことをしていました。

    >axiosは画面を移動せずにリクエストを行うものです。
    (例えばここのコメント送信のようなことが出来ます)
    画面を移動するのであればaxiosを使わず、formタグでPOSTすればよいです。

    この言葉でハッとしました、
    僕は、axiosのやっていることは、"/posts"に情報を送っているだけで、
    その後に実際にページを"/posts"に遷移し、コントローラを作動させてデータベースに保存しなきゃいけないと思っていました。そしてそのままreturnでブログトップページに飛ばすものだと思っていました。
    しかし実際は、axios.post("/posts",{})の時点で内部的にコントローラにデータが送られていたのですね、、。
    あとは、.then((res) => {
    window.location = "/";
    })
    とするだけで、トップページに自動遷移してくれました。

    axiosの画面を移動せずにリクエストを行うという根本的なところが曖昧になっていた僕の勉強不足でした。

    @blue32aさんとのやり取りの中で少しずつ違和感を感じ、自分の過ちに気づくことができました。
    いつも本当にありがとうございます。
  13. 解決できたようでよかったです。

    > axios.post("/posts",{})の時点で内部的にコントローラにデータが送られていたのですね

    そうです。
    aタグでもformタグでもaxiosでも、リクエスト送ってレスポンスを受け取る、という点でどれも同じです。
    このあたりはWebの基本的なもので、ツール(Laravelやaxios)が変わっても同じところです。

Your answer might help someone💌