#php #laravel
#php #laravel
Вопрос:
я новичок в laravel. я столкнулся с проблемой, когда маршрут [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');
Комментарии:
1. Ваш маршрут должен быть установлен после get
Ответ №1:
Ваш маршрут обновления определяется как маршрут получения, в то время как ваша форма редактирования пытается отправить post-запрос на маршрут
В идеале маршрут обновления должен быть определен как маршрут PUT или PATCH. И если вы используете Laravel 8.x, то у вас должен быть FQCN для контроллеров
//import use statements at the top
//use IlluminateSupportFacadesRoute;
//use AppHttpControllersStudentController;
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');
}
Комментарии:
1. у сэра есть одно сомнение в маршруте::match([‘PUT’, ‘PATCH’] как это работает. Маршрут::post мы не можем поставить
2. сэр рабочий, пожалуйста, скажите мне, в чем разница между Route::match([‘PUT’, ‘PATCH’] и Route::post
3. Первый аргумент Route::match() — это массив, который даст указание Laravel сопоставить любой из методов внутри массива — так что в этом случае он будет соответствовать либо запросу PUT, либо запросу PATCH. Согласно соглашениям REST — действие обновления должно выполняться либо с помощью запроса PUT, либо с помощью PATCH. Следовательно, следуя соглашению, мы объявляем маршрут как совпадающий, который будет соответствовать как запросам PUT, так и запросам PATCH