3

Laravel show me this error when I am updating through resource controller

Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException The POST method is not supported for this route. Supported methods: GET, HEAD, PUT, PATCH, DELETE.

I am very new to laravel. Spend more time to overcome this issue.

This is my Controller.

<?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)
    {
        //
    }
}

This is my route.

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']);

This is my 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

2 Answers 2

2

For rosource controller, update method should be PUT or PATCH, like :

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

So in your code :

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

See The Official Documentation of Resource Controller

Sign up to request clarification or add additional context in comments.

Comments

0

Try this!

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.