问题描述
这可能是一个很简单的问题,但我想不通!这令人沮丧。 我尽我所能一步一步地解释一切。
ShowController.PHP
public function show(Project $project)
{
return view('projects.show',compact('project'));
}
show.blade.PHP
<form action="{{ route('project.update',['project' => $project]) }}" method="post">
@csrf
@method('PUT')
<textarea name="notes" placeholder="Add notes">{{ $project->notes ?? '' }}</textarea>
<button type="submit">Save</button>
</form>
- 哪里出错了,更新项目!一旦用户在评论字段中输入内容并点击保存,表单就会显示以下项目是必需的:
- owner_id、title、description 字段是必填字段。而模型被发送到显示刀片页面,然后在表单操作路由中。 我在这里做错了什么?
UpdateController.PHP
public function update(ProjectRequest $request,Project $project)
{
$validated = $request->validated();
$project->update($validated);
return redirect($project->path());
}
ProjectRequest.PHP
public function rules(): array
{
return [
'owner_id' => 'required','title' => 'required','description' => 'required','notes' => 'nullable',];
web.PHP
use App\Http\Controllers\Projects\CreateController;
use App\Http\Controllers\Projects\IndexController;
use App\Http\Controllers\Projects\ShowController;
use App\Http\Controllers\Projects\StoreController;
use App\Http\Controllers\Projects\UpdateController;
use Illuminate\Support\Facades\Route;
Route::get('/',[IndexController::class,'index'])->name('project.index');
Route::get('/projects/create',[CreateController::class,'create'])->name('project.create');
Route::post('/projects',[StoreController::class,'store'])->name('project.store');
Route::get('/projects/{project}',[ShowController::class,'show'])->name('project.show');
Route::put('/projects/{project}',[UpdateController::class,'update'])->name('project.update');
迁移
public function up()
{
Schema::create('projects',function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('owner_id');
$table->string('title');
$table->text('description');
$table->text('notes')->nullable();
$table->timestamps();
$table->foreign('owner_id')
->references('id')
->on('users')
->onDelete('cascade');
});
}
解决方法
如果不需要这些字段,则将它们从 $required 数组中取出,它应该可以工作。
,将模型 ID 注入路由或控制器操作时,您将 经常查询数据库检索对应的模型 那个身份证。 Laravel 路由模型绑定提供了一种方便的方法 自动将模型实例直接注入到你的路由中。 例如,您可以不注入用户 ID,而是注入 与给定 ID 匹配的整个 User 模型实例。 Reference
show.blade.php
<form action="{{ route('project.update',['project' => $project->id]) }}" method="post">
@csrf
@method('PUT')
<textarea name="notes" placeholder="Add notes">{{ $project->notes ?? '' }}</textarea>
<button type="submit">Save</button>
</form>
此外,要更新列,您无需验证和更新所有列。
更新控制器.php
public function update(Request $request,Project $project)
{
$request->validate([
'title' => 'nullable|string',]);
$project->update(['notes' => $request->notes ?? '']);
return redirect($project->path());
}
注意:添加 use Illuminate\Http\Request;到第一个 UpdateController.php 文件。
,您对表单中不存在的字段设置了必填规则。所以验证正确失败。
如果您使用这些规则来存储数据,并希望使用不同的规则进行更新,那么您至少有以下三种解决方案:
- 制作单独的表单请求文件。所以改为
ProjectRequest
为 前任。ProjectUpdateRequest
和ProjectStoreRequest
。 - 使用单个请求,但在
rules()
函数内检测它是更新还是存储,并根据它返回不同的规则数组。相关问题:Laravel form request validation on store and update use same validation - 根本不要使用自定义 FormRequest 进行更新,只需在控制器
update()
函数中进行此单一验证。 https://laravel.com/docs/8.x/validation#quick-writing-the-validation-logic
选项 2 似乎是最好的解决方案,因为您不必在多个位置为“注释”输入重复验证规则 - 一切都将在单个文件中。