首页 > 解决方案 > Laravel 编辑函数重定向

问题描述

我正在编写一个测验应用程序,我正在尝试向它添加一个编辑功能。单击“提交”按钮,我收到错误缺少 [Route: quiz/show] [URI: quiz/{quiz}] 的必需参数。 我该如何解决?我是 Laravel 的初学者,所以如果你能帮助我,那就太好了。

我的 web.php

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ProductController;
use App\Http\Controllers\MainController;
use App\Http\Controllers\QuizController;
use App\Http\Controllers\DashboardController;

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

Route::get('/', function () {
    return view('welcome');
});


Route::middleware(['auth:sanctum', 'verified'])->get('/dashboard', function () {
    return view('dashboard');
})->name('dashboard');

Route::get('dashboard', 'App\Http\Controllers\DashboardController@index')->name('dashboard');

Route::get('quiz/create', 'App\Http\Controllers\QuizController@create');
Route::post('quiz', 'App\Http\Controllers\QuizController@store');
Route::get('quiz/{quiz?}', 'App\Http\Controllers\QuizController@show')->name('quiz/show');

Route::get('quiz/{quiz}/questions/create', 'App\Http\Controllers\QuestionController@create');
Route::post('quiz/{quiz}/questions', 'App\Http\Controllers\QuestionController@store');
Route::delete('quiz/{quiz}/questions/{question}', '\App\Http\Controllers\QuestionController@destroy');
Route::get('question/edit', '\App\Http\Controllers\QuestionController@edit')->name('question/edit');
Route::patch('question/{question}', '\App\Http\Controllers\QuestionController@update')->name('question/update');

Route::get('startquiz/{quiz}-{slug}', 'App\Http\Controllers\StartQuizController@show');
Route::post('startquiz/{quiz}-{slug}', 'App\Http\Controllers\StartQuizController@store');

我的问题控制器

<?php

namespace App\Http\Controllers;

use App\Models\Question;
use App\Models\Quiz;
use Illuminate\Http\Request;

class QuestionController extends Controller
{
    public function create(Quiz $quiz) {
        return view('question.create', compact('quiz'));
    }

    public function store(Quiz $quiz) {
        $data = request()->validate([
            'question.question' => 'required',
            'answers.*.answer' => 'required',
        ]);

        $question = $quiz->questions()->create($data['question']);
        $question->answers()->createMany($data['answers']);

        return redirect('/quiz/'.$quiz->id);
    }

    public function destroy(Quiz $quiz, Question $question) {
        $question->answers()->delete();
        $question->delete();

        return redirect($quiz->path());
    }
    public function edit(Question $question) {
       return view('quiz.edit', compact('question'));
    }

    public function update(Request $request, Question $question, Quiz $quiz) {
        //$request->validate([
            //'question' => 'required',
        //]);
        $question->update($request->all());
        //dd($quiz);
        return redirect()->route('quiz/show', ['quiz' => $question->quiz])
                        -> with('success', 'Question updated successfully');
    }
}

我的edit.blade

<html>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
    <body>


        <h1>Edit Question</h1>
        <form action="{{ route('question/update',$question->id) }}" method="POST">
            @csrf
            @method('PATCH')

            <div class="container">
                <div class="row justify-content-center">
                    <div class="col-xs-12 col-sm-12 col-md-12">
                            <div class="form-group">
                                <label for="question">Question</label>
                                <input type="text" class="form-control" name="question" value="{{ $question->name }}"placeholder="Enter Question">
                                <small id="questionHelp" class="form-text text-muted">Type in your edited question.</small>
                            </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>
            </div>

        </form>


    </body>
</html>

标签: phpmysqllaravellaravel-8

解决方案


您的“更新”路线不带任何参数。您update的控制器方法看起来像是要使用路由模型绑定,但没有参数,因此您得到一个不存在的实例,Quiz该实例没有,id因此在生成 URL 时尝试使用null您无法对路由参数执行的操作.

您需要调整您的路由 URI 定义以采用参数questionquiz。也许:

Route::patch('quiz/{quiz}/question/{question}', ...)

如果您不想为测验或问题使用路由参数,则必须对控制器进行调整以从请求输入中获取信息。

其他快速选项:

您应该能够从问题中得出测验,因此您无需通过测验:

Route::patch('question/{question}', ...)

public function update(Request $request, Question $question)
{
    $question->update($request->all());

    return redirect()->route('quiz/show', ['quiz' => $question->quiz])
        ->with('success', 'Question updated successfully');
}

推荐阅读