Маршрут [student.update] не определен. использование laravel 7

#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