php - 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>
解决方案
您的“更新”路线不带任何参数。您update
的控制器方法看起来像是要使用路由模型绑定,但没有参数,因此您得到一个不存在的实例,Quiz
该实例没有,id
因此在生成 URL 时尝试使用null
您无法对路由参数执行的操作.
您需要调整您的路由 URI 定义以采用参数question
和quiz
。也许:
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');
}
推荐阅读
- swift - Firestore 文档中是否可以有一个 [String: Any] 数组?
- python - 如何使用图像从 Nodejs 调用 tensorflow_model_server
- amazon-web-services - 如何在应用程序中使用 alexa voice sdk 或 api?
- javascript - 是否有同步 xhr 的替代方案,它提供了对用户输入的本地处理进行排队的功能?
- ruby-on-rails - 无法从 Rails 表单中检索参数
- python - 仅获取全年星期一的每小时平均值
- snowflake-cloud-data-platform - 重新安装 DUO 应用程序后,我需要重新启用 MFA
- javascript - 从 django 到 JS 的数据
- entity-framework - Blazor 服务器和实体框架。如何避免对数据库的多次冲突调用
- .net - o数据不区分大小写过滤器包含