Обновление формы в Laravel идет не так

Это может быть очень простой вопрос, но я не могу его понять! и это расстраивает. Я стараюсь все объяснять шаг за шагом.

  • Это небольшой проект списка Todo в Laravel 8
  • Пользователь может создать проект.
  • Когда пользователь нажимает на созданный проект, он переходит на страницу проекта (показать страницу)

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');
        });
    }

person Mohsen    schedule 18.04.2021    source источник
comment
Я не понимаю. Почему существуют обязательные правила для owner_id, title и description и есть только один ввод для примечаний в форме? Откуда должны быть эти данные? Требуется ввести заголовок, но в запросе нет заголовка, поэтому, конечно, проверка не удастся.   -  person chojnicki    schedule 18.04.2021
comment
Спасибо за ваш комментарий. Я просто хочу обновить комментарий! Является ли это возможным? Должен ли я делать отдельный запрос на валидацию только для комментариев? Я думал, что если я передам объект Project маршруту формы действия, у меня не возникнет проблем с проверкой, потому что объект проекта уже содержит owner_id, title и description.   -  person Mohsen    schedule 18.04.2021
comment
Отвечает ли это на ваш вопрос? Проверка запроса формы Laravel при хранении и обновлении использует то же проверка   -  person chojnicki    schedule 18.04.2021
comment
@Mohnsen, вы можете сделать отдельный запрос формы или определить, является ли это функцией сохранения или обновления внутри правил.   -  person chojnicki    schedule 18.04.2021
comment
спасибо за чаевые! Я посмотрю   -  person Mohsen    schedule 18.04.2021
comment
@chojnicki Спасибо за советы. Поместите свой ответ здесь, я буду проверять его как лучший ответ! Спасибо   -  person Mohsen    schedule 18.04.2021


Ответы (3)


У вас есть обязательные правила для полей, которых нет в форме. Итак, проверка корректно не выполняется.

Если вы используете эти правила для хранения данных и хотите, чтобы для обновления использовалось другое, то у вас есть как минимум три решения:

  1. Сделайте отдельный файл запроса формы. Так что вместо ProjectRequest сделайте напр. ProjectUpdateRequest и ProjectStoreRequest.
  2. Используйте единый запрос, но определяйте, является ли он обновлением или сохранением внутри функции rules(), и возвращайте на его основе другой массив правил. Связанный вопрос: Проверка запроса формы Laravel в магазине и обновить использовать ту же проверку
  3. Ни в коем случае не используйте пользовательский FormRequest для обновления, просто выполните эту единственную проверку внутри функции update() контроллера. https://laravel.com/docs/8.x/validation#quick-writing-the-validation-logic

Вариант 2 кажется лучшим решением, потому что вам не придется повторять правила проверки для ввода заметок в нескольких местах - все будет в одном файле.

person chojnicki    schedule 18.04.2021

Если поля не требуются, выньте их из своего массива $ required, и он должен работать.

person Toby Allen    schedule 18.04.2021

При введении идентификатора модели в действие маршрута или контроллера вы часто будете запрашивать базу данных для получения модели, соответствующей этому идентификатору. Привязка модели маршрута Laravel обеспечивает удобный способ автоматического внедрения экземпляров модели непосредственно в ваши маршруты. Например, вместо того, чтобы вводить идентификатор пользователя, вы можете внедрить весь экземпляр модели User, который соответствует данному идентификатору. Справочник

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>

Кроме того, чтобы обновить столбец, вам не нужно проверять и обновлять все столбцы.

UpdateController.php

  public function update(Request $request, Project $project)
     {
      $request->validate([
            'title' => 'nullable|string',
        ]);
      $project->update(['notes' => $request->notes ?? '']);
      return redirect($project->path());
     }

Примечание. Добавьте использование Illuminate \ Http \ Request; в первый файл UpdateController.php.

person Amirali Hamedifar    schedule 18.04.2021