я новичок в ларавеле. Я столкнулся с проблемой, когда Route [student.update] не определен. используя laravel 7. при запуске проекта laravel. то, что я пробовал до сих пор, я прикрепил ниже. я прикрепил контроллер и файл просмотра и маршрута ниже, я не знаю, в чем была проблема.
Контроллер
public function edit(Student $student)
{
return view('edit')->with('student',$student);
}
public function update(Request $request, Student $student)
{
Student::update([
'name' => $request->name,
'phone' => $request->phone,
'address' => $request->address,
'created_at' => now(),
]);
return redirect()->route('student.index')->with('success', 'Student has been Updatedddd');
}
edit.blade.php
<form action = "{{ route('student.update',$student->id) }}" method = "POST">
@csrf
<div class = "row">
<div class = "col-xs-12 col-sm-12 col-md-12">
<div class = "form-group">
<strong>Name:</strong>
<input type = "text" name = "name" value = "{{ $student->name }}" class = "form-control" placeholder = "Name">
</div>
</div>
<div class = "col-xs-12 col-sm-12 col-md-12">
<div class = "form-group">
<strong>Phone:</strong>
<input class = "form-control" name = "phone" value = "{{ $student->phone }}" placeholder = "Phone"></textarea>
</div>
</div>
<div class = "col-xs-12 col-sm-12 col-md-12">
<div class = "form-group">
<strong>Address:</strong>
<input class = "form-control" name = "address" value = "{{ $student->address }}" placeholder = "Address"></textarea>
</div>
</div>
<div class = "col-xs-12 col-sm-12 col-md-12 text-center">
<button type = "submit" class = "btn btn-primary">Submit</button>
</div>
</div>
</form>
index.blade.php
@extends('layout')
@section('content')
<div class = "row">
<div class = "col-lg-12 margin-tb">
<div class = "pull-left">
<h2>Laravel 7 CRUD Example from scratch - ItSolutionStuff.com</h2>
</div>
<div class = "pull-right">
<a class = "btn btn-success" href = "{{ route('student.create')}}"> Create New Student</a>
</div>
</div>
</div>
@if ($message = Session::get('success'))
<div class = "alert alert-success">
<p>{{ $message }}</p>
</div>
@endif
<table class = "table table-bordered">
<tr>
<th>No</th>
<th>Name</th>
<th>Phone</th>
<th>Address</th>
<th width = "280px">Action</th>
</tr>
@foreach ($students as $student)
<tr>
<td>{{ $student->id }}</td>
<td>{{ $student->name }}</td>
<td>{{ $student->phone }}</td>
<td>{{ $student->address }}</td>
<td>
<a class = "btn btn-primary" href = "{{ route('student.edit',$student->id) }}">Edit</a>
<button type = "submit" class = "btn btn-danger">Delete</button>
</td>
</tr>
@endforeach
</table>
{!! $students->links() !!}
@endsection
Маршруты
Route::get('/students/{student}', 'StudentController@edit')->name('student.edit');
Route::get('/students/{student}', 'StudentController@update')->name('student.update');
Ваш маршрут обновления определяется как маршрут получения, в то время как ваша форма редактирования пытается отправить запрос на отправку маршрута.
В идеале маршрут обновления должен быть определен как маршрут PUT или PATCH. А если вы используете Laravel 8.x, то у вас должен быть FQCN для контроллеров
//import use statements at the top
//use Illuminate\Support\Facades\Route;
//use App\Http\Controllers\StudentController;
Route::match(['PUT', 'PATCH'], '/students/{student}', [StudentController::class, 'update'])->name('student.update');
А затем сделайте запрос отправки PUT или PATCH из edit.blade.php.
<form action = "{{ route('student.update',$student->id) }}" method = "POST">
@csrf
@method('PUT') //Method spoofing
<div class = "row">
<div class = "col-xs-12 col-sm-12 col-md-12">
<div class = "form-group">
<strong>Name:</strong>
<input type = "text" name = "name" value = "{{ $student->name }}" class = "form-control" placeholder = "Name">
</div>
</div>
<div class = "col-xs-12 col-sm-12 col-md-12">
<div class = "form-group">
<strong>Phone:</strong>
<input class = "form-control" name = "phone" value = "{{ $student->phone }}" placeholder = "Phone"></textarea>
</div>
</div>
<div class = "col-xs-12 col-sm-12 col-md-12">
<div class = "form-group">
<strong>Address:</strong>
<input class = "form-control" name = "address" value = "{{ $student->address }}" placeholder = "Address"></textarea>
</div>
</div>
<div class = "col-xs-12 col-sm-12 col-md-12 text-center">
<button type = "submit" class = "btn btn-primary">Submit</button>
</div>
</div>
</form>
И измените метод контроллера
public function update(Request $request, Student $student)
{
$student->update([
'name' => $request->name,
'phone' => $request->phone,
'address' => $request->address,
'created_at' => now(),
]);
return redirect()->route('student.index')->with('success', 'Student has been Updatedddd');
}
сэр есть одно сомнение Route::match(['PUT', 'PATCH'] как это работает. Route::post мы не можем поставить
сэр, работаете, пожалуйста, скажите мне, чем отличается Route::match(['PUT', 'PATCH'] и Route::post
Первый аргумент Route::match() — это массив, который будет указывать Laravel на соответствие любому из методов в массиве, поэтому в этом случае он будет соответствовать запросу PUT или PATCH. В соответствии с соглашениями REST действие обновления должно выполняться через запрос PUT или PATCH. Следовательно, следуя соглашению, мы объявляем маршрут как совпадение, которое будет соответствовать запросам PUT и PATCH.
Ваш маршрут должен быть опубликован вместо get