phplaravelrouteshttp-status-code-404storing-data

I use url in action and get 404 not found but route is exist and when I use route I get error route is not defined in Laravel


I want a make storing orders for speaker/book in the database but I don't use a chart so after filling in the text field it will be inserted into the database table and only logged-in users can make bookings. Is the flow of my program logic below wrong? When I use this

<form method="POST" action="{{ url('speaker/book-store') }}">
    @csrf
</form>

I get error 404 not found but my route in web.php is exist here web.php.

Route::get('/speaker/book', ' App\Http\Controllers\ProductController@create')-> name('speaker/book-create');
Route::post('/speaker/book', 'App\Http\Controllers\ProductController@store')->name('speaker/book-store');

But when I use route not URL like this:

<form method="POST" action="{{ route('speaker/book-store') }}">
    @csrf
</form>

I get error route is not defined:

This is my ProductController

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Order;
use App\Models\User;
use Auth;
class ProductController extends Controller {
    public function create() {
        return view('speaker/book');
    }

    public function store(Request $request) {
        $order =new Order();
        $order->date=$request->input('date');
        $order->date=$request->input('time');
        $order->date=$request->button('acara');
        $order->date=$request->textarea('detail');
        Auth::user()->orders()->save($order);

        return redirect()->back()->with('success'); 
    }
}

Models Order

<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Order extends Model {
    use HasFactory;

    public function user() {
        return $this-> belongsTo('App\User');
    }
}

Models User I add like this:

public function orders() {
    return $this->hasMany('App\Order');
}

Solution

  • The Routes you defined is not proper the URL should not be same

    OLD Routes

    Route::get('/speaker/book', function() { return view('speaker/book'); }); 
    
    Route::get('/speaker/book', ' App\Http\Controllers\ProductController@create')
     ->name('speaker.book-create');
    
    Route::post('/speaker/book', 'App\Http\Controllers\ProductController@store')
     ->name('speaker.book-store'); 
    

    New Routes - Try this routes

    Route::get('/speaker/book/view', function() { return view('speaker/book'); });
    
    Route::get('/speaker/book/create', 
    'App\Http\Controllers\ProductController@create')->name('speaker.book-create');
    
    Route::post('/speaker/book/store', 
    'App\Http\Controllers\ProductController@store')->name('speaker.book-store'); 
    

    In Action for book.blade.php

     {{ route('speaker.book-store') }}
    

    Understand One thing even if providing a route to the form-action , while posting the form it gets converted to URL because of your same URL define it's getting conflicted