在 Laravel 中更新表单出错

问题描述

这可能是一个很简单的问题,但我想不通!这令人沮丧。 我尽我所能一步一步地解释一切。

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 文件。

,

您对表单中不存在的字段设置了必填规则。所以验证正确失败。

如果您使用这些规则来存储数据,并希望使用不同的规则进行更新,那么您至少有以下三种解决方案:

  1. 制作单独的表单请求文件。所以改为 ProjectRequest 为 前任。 ProjectUpdateRequestProjectStoreRequest
  2. 使用单个请求,但在 rules() 函数内检测它是更新还是存储,并根据它返回不同的规则数组。相关问题:Laravel form request validation on store and update use same validation
  3. 根本不要使用自定义 FormRequest 进行更新,只需在控制器 update() 函数中进行此单一验证。 https://laravel.com/docs/8.x/validation#quick-writing-the-validation-logic

选项 2 似乎是最好的解决方案,因为您不必在多个位置为“注释”输入重复验证规则 - 一切都将在单个文件中。