【问题标题】:I have a problem with updating function in laravel resource controlling我在 laravel 资源控制中更新功能有问题
【发布时间】:2020-11-11 14:35:41
【问题描述】:

当我通过资源控制器更新时,Laravel 会显示此错误

Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException 此路由不支持 POST 方法。支持的方法:GET、HEAD、PUT、PATCH、DELETE。

我对 laravel 很陌生。花更多的时间来解决这个问题。

这是我的控制器。

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Category;

class CategoriesController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }
    
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $arr['categories'] = Category::all();
        return view('admin.categories.index')->with($arr);
    }

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

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request, Category $category)
    {
        $category-> title = $request-> title;
        $category->save();
        return redirect()->route('admin.categories.index');
       
    }

    /**
     * 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(Category $category)
    {
        $arr['category'] = $category;
        return view('admin.categories.edit')->with($arr);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    
    public function update(Request $request, Category $category)
    {
        $category->title = $request->title;
        $category->update();
        return redirect()->route('admin.categories.index');
       
    }


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

这是我的路线。

Route::get('/home', 'HomeController@index')->name('home');
Route::get('/admin', 'HomeController@test')->name('admin');
Route::get('/test', 'TestController@index')->name('test');
Route::resource('/admin/categories', 'Admin\CategoriesController', ['as'=>'admin']);

这是我的 edit.blade.php

@extends('layouts.admin')
@section('content')

<div class="content-header">
    <div class="container-fluid">
        <div class="row mb-2">
          <div class="col-sm-6">
            <h1 class="m-0 text-dark"> Edit Categories</h1>
          </div><!-- /.col -->
          <div class="col-sm-6">
            <ol class="breadcrumb float-sm-right">
              <li class="breadcrumb-item"><a href="{{ url('/admin') }}">Dashboard</a></li>
              <li class="breadcrumb-item active"> Edit Categories</li>
            </ol>
          </div><!-- /.col -->
        </div><!-- /.row -->
    </div><!-- /.container-fluid -->
</div>
<section class="content">
    <div class="container-fluid">
       <form method="post" action="{{ route('admin.categories.update', $category->id) }}">
           <input type="hidden" name="_token" value="{{ csrf_token() }}"
            <div class="form-group">
                <div class="row">
                        <label class="col-md-3">Title</label>
                        <div class="col-md-6">
                        <input type="text" name="title" class="form-control" value="{{ $category->title }}">
                        </div>  
                        <div class="clearfix"> </div> 
                </div> 
                <div class="form-group">
                   <input type="submit" class="btn btn-info" value="Save">
                </div>  
            </div> 
       </form>
    </div>
</section>    

@endsection

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    对于 rosource 控制器,更新方法应为 PUT 或 PATCH,如:

    <form action="/foo/bar" method="POST">
        @method('PATCH')
    </form>
    

    所以在你的代码中:

    <form method="post" action="{{ route('admin.categories.update', $category->id) }}">
        @method('PATCH')
        <input type="hidden" name="_token" value="{{ csrf_token() }}"
         <div class="form-group">
             <div class="row">
                     <label class="col-md-3">Title</label>
                     <div class="col-md-6">
                     <input type="text" name="title" class="form-control" value="{{ $category->title }}">
                     </div>  
                     <div class="clearfix"> </div> 
             </div> 
             <div class="form-group">
                <input type="submit" class="btn btn-info" value="Save">
             </div>  
         </div> 
    </form>
    

    查看Resource Controller

    的官方文档

    【讨论】:

      【解决方案2】:

      试试这个!

      Route::post('/admin/categories', 'Admin\CategoriesController@update', ['as'=>'admin'])->name('admin.categories.update');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多