Ошибка 404 в laravel 9.2, хотя маршрут и представление существуют

Я пытаюсь создать новое представление для своего проекта, поэтому я создал соответствующий маршрут, функцию и представление, но даже при этом браузер выдает ошибку 404.

Вот мой файл web.php:

<?php

use Illuminate\Database\PostgresConnection;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\CartController;
use App\Http\Controllers\PageController;

/*
|--------------------------------------------------------------------------
| 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!
|
*/

// INDEX 
Route::get('/', function () {
    return view('welcome');
})->name('/');

// AUTH ROUTES
Auth::routes();

Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');

// CART ROUTES
Route::get('/shop', [CartController::class, 'shop'])->name('shop');
Route::get('/cart', [CartController::class, 'cart'])->name('cart.index');
Route::post('/add', [CartController::class, 'add'])->name('cart.store');
Route::post('/update', [CartController::class, 'update'])->name('cart.update');
Route::post('/remove', [CartController::class, 'remove'])->name('cart.remove');
Route::post('/clear', [CartController::class, 'clear'])->name('cart.clear');

// PROFILE
Route::get('/{username}', [PageController::class, 'profile'])->name('profile');

//PRODUCTS
Route::get('/product/{id}', [PageController::class, 'product'])->name('product');
Route::get('/product/create', [PageController::class, 'create'])->name('product.create');

Мой файл PageController.php:

<?php

namespace App\Http\Controllers;

use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class PageController extends Controller
{
    public function profile() {
        if ( isset(Auth::user()->name )) {
            $user = Auth::user();
            return view('profile', compact('user'));
        } else {
            return redirect()->route('login');
        }
    }

    public function product($id) {
        $product = Product::findOrFail($id);
        return view('product.product', compact('product'));
    }

    public function create() {
        return view('product.create');
    }
}

И, наконец, мой файл create.blade.php:

@extends('template')

@section('title')
    Create product
@endsection

@section('favicon')
    <link rel = "shortcut icon" href = "../favicon.ico" type = "image/x-icon">
@endsection

@section('css')
    <link rel = "stylesheet" href = "../css/bootstrap.min.css">
    <link rel = "stylesheet" href = "../css/dropdown-cart.css">
@endsection

@section('content')
    <h1>Create product</h1>
@endsection

обратите внимание, что файл create.blade.php находится в отдельной папке с именем product.

Я проверил другие графические ошибки и, возможно, я слепой, но я ничего не вижу. Я надеялся, что страница будет работать, и мое представление будет отображаться, но ничего.

На самом деле, вам, вероятно, просто нужно переместить Route::get('/product/{id}', ... после Route::get('/product/create', ...), иначе переход к /products/create приведет к столкновению с этим /products/{id} маршрутом, и у вас нет продукта в вашей базе данных с id из create 😅

Tim Lewis 26.04.2023 20:49

Также для справки, ::findOrFail() вызовет исключение ModelNotFound, которое Laravel автоматически сопоставляет с HTTP 404, что объясняет, почему все выглядит правильно (маршрут, метод и представление существуют), но вы все еще сталкиваетесь с ошибкой 404.

Tim Lewis 26.04.2023 21:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно поместить этот параметризованный маршрут в конец файла

// PROFILE
Route::get('/{username}', [PageController::class, 'profile'])->name('profile');

Route::get('/product/{id}', [PageController::class, 'product'])->name('product');

потому что все другие маршруты ниже этого будут соответствовать переменному параметру. вы можете прочитать больше здесь

Решение:

//PRODUCTS
Route::get('/product/create', [PageController::class, 'create'])->name('product.create');
Route::get('/product/{id}', [PageController::class, 'product'])->name('product');

// PROFILE
Route::get('/{username}', [PageController::class, 'profile'])->name('profile');

Другие вопросы по теме