【问题标题】:Laravel with ajax vanila javascriptLaravel 与 ajax vanilla javascript
【发布时间】:2020-04-18 17:41:43
【问题描述】:

我是 laravel 的新用户,我正在尝试创建一个联系人应用程序来练习。

我如何调用 url 或使用 javascript 路由控制器?,显示我的代码来解释我。我在名为 insertDate 的控制器联系人中创建了新方法。我在视图 save.blade.php 中调用此方法并在主体模板 navs.blade.php 中使用 ajax 此文档位于文件夹布局中,javascript 脚本位于文件夹 public js/ajax.js 中。

控制台导航器,打印错误 404 not found POST,是脚本 url,我如何调用我的控制器或路由的 url?

Web.php

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

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

Route::resource('contactos', 'Contacts');

Route::post('contactos', 'Contacts@insertDate')->name('contacts.insertDate');

联系人控制器

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Contact;

class Contacts extends Controller
{
    public function __construct(){

        //$this->middleware('auth');

    }
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */

    public function index()
    {
        //
        $ejemplo = 'Prueba';
        $hola = 'pepito es pepa';
        return view('save', compact('ejemplo', 'hola'));
    }

    public function insertDate(Request $request)
    {
        if($request->ajax()){
            $contact = new Contact;
            $contact->name = $request->name;
            $contact->phone = $request->phone;
            $contact->save();

        }



    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

拯救刀片

<div class="container-form">
    <form action="{{ route('contacts.insertDate')}}" method="POST">
            @csrf
            <input type="text" name="name" id="name" class="form-control-sm inputs" placeholder="Persona">
            <input type="text" name="phone" id="phone" class="form-control-sm inputs" placeholder="Celular">
            <button id="save" class="btn btn-primary btn-sm">Guardar</button>
        </form>
    </div>

ajax

let name = document.querySelector('#name').value;
let phone = document.querySelector('#phone').value;
let save = document.querySelector('#save');
let getUrl = "{{ route('contactos') }}";

const saveDate = ( url, var1, var2) =>{
    let xhttp = new XMLHttpRequest;
    let token = '{{ csrf_token() }}';
    let data = {
        _token: token,
        name: var1,
        phone: var2
    }
    xhttp.open('POST', url, true);
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhttp.send(data);
}

save.addEventListener('click', saveDate(getUrl, name, phone));

控制台导航器,打印错误 404 not found POST,是脚本 url,我如何调用我的控制器或路由的 url?

【问题讨论】:

  • 没有名称为contactosroute('contactos'),我猜你的getUrl应该是{{ route('contacts.insertDate') }}
  • 嗨 Muhammad Amirozzaman Niaz,谢谢,但控制台浏览器会打印此错误 ajax.js:16 POST contactos.test/… 404 (Not Found)
  • {{ route('contacts.insertDate') }} 应该返回一个 URL,而不是它本身。由于这是刀片语法,它必须在刀片.php 文件中才能使用 url 呈现。
  • 尝试在getUrl 中插入硬编码的url,以测试您的请求是否成功。
  • mmm 请举个例子,我在模板 nav.blade.php 中有这个脚本,我删除了代码脚本 src="{{asset('js/ajax.js')}} 并添加@yield('script') 在模板视图中,在视图中添加脚本之前保存 @section 脚本,但我无法解决这个问题:/,你能帮我举个例子吗?

标签: javascript php ajax laravel


【解决方案1】:

Muhammad Amirozzaman Niaz 谢谢,我得到了答案,需要把 setRequestHeader('X-CSRF-TOKEN', document.querySelector('meta[name="csrf-token"]'))

ajax

let name = document.querySelector('#name').value;
let phone = document.querySelector('#phone').value;
let save = document.querySelector('#save');
let getUrl = document.forms.createContact;
let urls = getUrl.getAttribute('action')

const saveDate = ( url, var1, var2) =>{
    let xhttp = new XMLHttpRequest;
    let token = document.querySelector('meta[name="csrf-token"]').getAttribute('content');;
    let data = {
        _token: token,
        name: var1,
        phone: var2
    }
    xhttp.open('POST', url, true);
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhttp.setRequestHeader('X-CSRF-TOKEN', token);
    xhttp.send(data);
}

save.addEventListener('click', saveDate(urls, name, phone));

查看保存刀片

@extends('layouts.nav')


@section('content')
   <style>
       .container-form{
           display: flex;
           justify-content: center;
           margin-top: 25px;
       }
       .table-insert{
           margin-top:25px;
       }
   </style>

    <div class="container">
        <h2 class="text-center">Welcome to Contact App</h2>
        <h4 class="text-center">{{-- auth()->user()->name --}}</h4>
    </div>

    <div class="container-form">
    <form action="{{ route('contacts.insertDate')}}" method="POST" name="createContact">
            @csrf
            <input type="text" name="name" id="name" class="form-control-sm inputs" placeholder="Persona">
            <input type="text" name="phone" id="phone" class="form-control-sm inputs" placeholder="Celular">
            <button id="save" class="btn btn-primary btn-sm">Guardar</button>
     </form>
    </div>

    <div class="container table-insert">

    </div>

@endsection

@section('script')
<script src="{{ asset('js/ajax.js') }}"></script>
@endsection

控制器联系人

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Contact;

class Contacts extends Controller
{
    public function __construct(){

        //$this->middleware('auth');

    }
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */

    public function index()
    {
        //
        $ejemplo = 'Prueba';
        $hola = 'pepito es pepa';
        return view('save', compact('ejemplo', 'hola'));
    }

    public function insertDate(Request $request)
    {
        if($request->ajax()){
            $contact = new Contact;
            $contact->name = $request->name;
            $contact->phone = $request->phone;
            $contact->save();
            return 'success';
        }



    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

【讨论】:

  • 干得好,$request-&gt;ajax() 给你正确的信息了吗?我试过了,没发现有用。
  • 很抱歉现在回答,但在委内瑞拉,灯消失了一个小时,我正在使用 $request->ajax() 和状态为 200 的浏览器响应,但没有在数据库中插入信息:(你有一个红色的社交让谈话更流畅吗?
【解决方案2】:

在您的blade 中试试这个

<div class="container-form">
<form action="{{ route('contacts.insertDate')}}" method="POST">
        @csrf
        <input type="text" name="name" id="name" class="form-control-sm inputs" placeholder="Persona">
        <input type="text" name="phone" id="phone" class="form-control-sm inputs" placeholder="Celular">
        <button id="save" class="btn btn-primary btn-sm">Guardar</button>
        <input id="url" value={{ route('contacts.insertDate') }} class="btn btn-primary btn-sm">
    </form>
</div>

还有ajax

let name = document.querySelector('#name').value;
let phone = document.querySelector('#phone').value;
let save = document.querySelector('#save');
let getUrl = document.querySelector('#url').value;

const saveDate = ( url, var1, var2) =>{
    let xhttp = new XMLHttpRequest;
    let token = '{{ csrf_token() }}';
    let data = {
        _token: token,
        name: var1,
        phone: var2
    }
    xhttp.open('POST', url, true);
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhttp.send(data);
}

save.addEventListener('click', saveDate(getUrl, name, phone));

【讨论】:

  • Muhammad Amirozzaman 控制台浏览器打印此错误 ajax.js:17 POST contactos.test/contactos 419(未知状态),我正在搜索此错误,结果是令牌。
  • 编辑你的控制器,所有的注释掉,只有return 'success'
  • 419返回CSRF保护,是不是这样设置的,检查一下。
  • 我在 if($request->ajax()){ return 'success';并更改代码 javascript let token = document.querySelector('meta[name="csrf-token"]').getAttribute('content');;和控制台打印相同的错误 419
  • 我什么都不删除,我把 return 'success';正如你告诉我的,但我有错误 419 ajax.js:17 POST contactos.test/contactos 419(未知状态),我在 javascript 中使用了错误的令牌吗?
猜你喜欢
  • 1970-01-01
  • 2018-06-03
  • 2020-05-05
  • 2011-06-06
  • 2020-04-06
  • 2021-09-18
  • 2020-01-18
  • 2019-03-12
  • 2020-04-26
相关资源
最近更新 更多