Я пытаюсь создать новое представление для своего проекта, поэтому я создал соответствующий маршрут, функцию и представление, но даже при этом браузер выдает ошибку 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.
Я проверил другие графические ошибки и, возможно, я слепой, но я ничего не вижу. Я надеялся, что страница будет работать, и мое представление будет отображаться, но ничего.
Также для справки, ::findOrFail()
вызовет исключение ModelNotFound
, которое Laravel автоматически сопоставляет с HTTP 404
, что объясняет, почему все выглядит правильно (маршрут, метод и представление существуют), но вы все еще сталкиваетесь с ошибкой 404.
Вам нужно поместить этот параметризованный маршрут в конец файла
// 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');
На самом деле, вам, вероятно, просто нужно переместить
Route::get('/product/{id}', ...
послеRoute::get('/product/create', ...)
, иначе переход к/products/create
приведет к столкновению с этим/products/{id}
маршрутом, и у вас нет продукта в вашей базе данных сid
изcreate
😅