Farirai's avatar

Getting error post method not supported when updating a users

i am using laravel and laravel splade when i am updating a users i get

The POST method is not supported for route users/9. Supported methods: GET, HEAD, PUT, PATCH, DELETE.

i have used route resource my controller

<?php

namespace App\Http\Controllers;

use App\Http\Requests\UserStoreRequest;
use Illuminate\Support\Collection;
use App\Models\User;
use ProtoneMedia\Splade\Facades\SEO;
use ProtoneMedia\Splade\Facades\Toast;
use ProtoneMedia\Splade\SpladeTable;
use Spatie\QueryBuilder\AllowedFilter;
use Spatie\QueryBuilder\QueryBuilder;

class UsersController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        SEO::title('Multi-auth-package');

        $globalSearch = AllowedFilter::callback('global', function (
            $query,
            $value
        ) {
            $query->where(function ($query) use ($value) {
                Collection::wrap($value)->each(function ($value) use ($query) {
                    $query
                        ->orWhere('name', 'LIKE', "%$value%")
                        ->orWhere('email', 'LIKE', "%$value%")
                        ->orWhere('type', 'LIKE', "%$value%");
                });
            });
        });

        $users = QueryBuilder::for(User::class)
            ->defaultSort('name')
            ->allowedFilters([
                'id',
                'name',
                'email',
                'type',
                'created_at',
                $globalSearch,
            ])
            ->allowedSorts(['id', 'name', 'email', 'type', 'created_at'])
            ->paginate()
            ->withQueryString();

        return view('users.index', [
            'users' => SpladeTable::for($users)
                ->defaultSort('name')
                ->withGlobalSearch()
                ->column('id', sortable: true, searchable: true)
                ->column(
                    'name',
                    canBeHidden: false,
                    sortable: true,
                    searchable: true
                )
                ->column('email', sortable: true, searchable: true)
                ->column('type')
                ->selectFilter('type', [
                    0 => 'User',
                    1 => 'Admin',
                    2 => 'SuperAdmin',
                ])
                ->column('created_at', sortable: true, searchable: true)
                ->column('action')
                ->rowLink(fn($user) => route('users.edit', $user->id)),
        ]);
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create()
    {
        SEO::title('Multi-auth-package');
        return view('users.create');
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(UserStoreRequest $request)
    {
        SEO::title('Multi-auth-package');
        User::create($request->validated());
        Toast::title('Success!')
            ->message('User Created Successfully!')
            ->success()
            ->info()
            ->leftTop()
            ->backdrop()
            ->autoDismiss(3);
        return redirect()->route('users.index');
    }

    /**
     * Display the specified resource.
     */
    public function show(User $user)
    {
        SEO::title('Multi-auth-package');
        //
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(User $user)
    {
        SEO::title('Multi-auth-package');
        return view('users.edit', [
            'user' => $user,
        ]);
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(UserStoreRequest $request, User $user)
    {
        SEO::title('Multi-auth-package');
        $user->update($request->validated());
        Toast::title('Success!')
            ->message('User Updated Successfully!')
            ->success()
            ->leftTop()
            ->info()
            ->backdrop()
            ->autoDismiss(3);
        return redirect()->route('users.index');
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(User $user)
    {
        SEO::title('Multi-auth-package');
        User::destroy($user);
        Toast::title('warning!')
            ->message('User Deleted Successfully!')
            ->success()
            ->leftTop()
            ->backdrop()
            ->autoDismiss(3);
        return redirect()->route('users.index');
    }
}

my edit.blade.php

<x-layout>
    <x-splade-form confirm="are you sure" :default="$user" :action="route('users.update', $user)" method="POST"
        class="w-full md:w-4/12 justify-center mx-auto mt-16 space-y-4 px-5 py-5 bg-white">
        @method('PUT')
        @csrf
        <h1 class="text-xl font-semibold text-center">Edit User, {{ $user->name }}</h1>
        <!-- Form fields -->
        <x-splade-input type="text" name="name" label="Full Name" class="w-full" />
        <x-splade-input name="email" type="text" label="Email" class="w-full" />
        <x-splade-input name="type" label="Type" class="w-full" />
        <x-splade-input type="password" name="password" label="Password" class="w-full" />
        <x-splade-input type="password" name="password_confirmation" label="Confirm Password" class="w-full" />
        <x-splade-button
            class="hover:bg-gray-200 hover:text-black transition w-full md:w-28 bg-gray-800 h-10 px-2 text-white font-semibold rounded font-sans">
            Submit
        </x-splade-button>
    </x-splade-form>
</x-layout>

my web.php

<?php

use App\Http\Controllers\UsersController;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\AdminDashboardController;
use App\Http\Controllers\SuperAdminDashboardController;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::middleware(['splade'])->group(function () {
    Route::get('/', fn() => view('home'))->name('home');
    Route::get('/docs', fn() => view('docs'))->name('docs');
    Route::get('/logs', fn() => view('logs'))->name('logs');
    Route::get('/login', fn() => view('auth.login'))->name('login');
    Route::get('/register', fn() => view('auth.register'))->name('register');
    Route::get('/forgot-password', fn() => view('auth.forgot-password'))->name(
        'forgot-password'
    );

    Route::get('/reset-password', fn() => view('auth.reset-password'))->name(
        'reset-password'
    );

    Route::middleware('auth')->group(function () {
        Route::resource('users', UsersController::class);
    });

    // Registers routes to support the interactive components...
    Route::spladeWithVueBridge();

    // Registers routes to support password confirmation in Form and Link components...
    Route::spladePasswordConfirmation();

    // Registers routes to support Table Bulk Actions and Exports...
    Route::spladeTable();

    // Registers routes to support async File Uploads with Filepond...
    Route::spladeUploads();
});

0 likes
2 replies
Snapey's avatar
Snapey
Best Answer
Level 122

splade form element accepts the method directly

https://splade.dev/docs/x-form

<x-splade-form confirm="are you sure" :default="$user" :action="route('users.update', $user)" method="PUT"
    class="w-full md:w-4/12 justify-center mx-auto mt-16 space-y-4 px-5 py-5 bg-white">
   {{-- @method('PUT') --}}

set the method on the form component, not separately. Probably the same for csrf

Please or to participate in this conversation.