【发布时间】:2021-07-13 01:52:23
【问题描述】:
这可能是一个很简单的问题,但我想不通!这令人沮丧。 我尽量一步一步解释。
- 这是 Laravel 8 中的一个小型 Todo 列表项目
- 用户可以创建项目。
- 当用户点击创建的项目时,他会进入项目页面(显示页面)
ShowController.php
public function show(Project $project)
{
return view('projects.show', compact('project'));
}
- 在显示页面中,用户可以通过 textarea 表单字段添加 cmets。
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>
- 问题出在此处,通过更新项目!只要用户在 cmets 字段中输入内容并单击保存,表单就会指示需要以下项目:
- 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');
});
}
【问题讨论】:
-
我不明白。为什么“owner_id”、“title”和“description”有必要的规则,而“notes”在表单中只有一个输入?这些数据应该从哪里来?需要输入“title”,但请求中没有“title”,所以验证当然会失败。
-
感谢您的评论。我只想更新评论!可能吗?我是否必须提出单独的验证请求才能发表评论?我想如果我将项目对象提供给操作表单路由,我将不会遇到验证问题,因为项目对象已经包含“owner_id”、“title”和“description”
-
@Mohnsen 您可以提出单独的表单请求或确定它是在规则功能内存储还是更新。
-
@chojnicki 谢谢你的提示。把你的答案放在这里我会检查它作为最佳答案!谢谢
标签: laravel laravel-8 laravel-request laravel-form