Отсутствуют обязательные параметры для маршрута (Laravel 5.8)

#laravel #forms

#laravel #формы

Вопрос:

Я пытаюсь воссоздать форму заявки на блог старой версии laravel в новой версии (5.8). В старой версии я использовал laravel collective для форм, и моя форма редактирования post выглядит следующим образом:

 @extends('layouts.app')

@section('content')
    <h1>Edit Post</h1>
    {!! Form::open(['action' => ['PostsController@update', $post->id], 'method' => 'POST', 'enctype' => 'multipart/form-data']) !!}
        <div class="form-group">
            {{Form::label('title', 'Title')}}
            {{Form::text('title', $post->title, ['class' => 'form-control', 'placeholder' => 'Title'])}}
        </div>
        <div class="form-group">
            {{Form::label('body', 'Body')}}
            {{Form::textarea('body', $post->body, ['class' => 'form-control', 'placeholder' => 'Body Text'])}}
        </div>
        {{Form::hidden('_method', 'PUT')}}
        {{Form::submit('Submit', ['class'=>'btn btn-primary'])}}            
    {!! Form::close() !!}
@endsection
  

Теперь я пытаюсь воссоздать ту же форму без коллективных форм laravel, потому что она, похоже, устарела.

Это моя попытка воссоздать эту форму:

 @extends('layouts.app')
@section('content')
    <h1>Edit post</h1>
    <form action="{{ route('posts.update'), $post->id }}" method="POST">
    @csrf
    <div class="form-group">
        <label for="title">Title</label>
        <input class="form-control" type="text" id="title" name="title" value={{$post->title}}>
    </div>
    <div class="form-group">
        <label for="body">Body</label>
        <textarea class="form-control" id="body" rows="3" name="body" value={{$post->body}}></textarea>
    </div>
    <input type="submit" class="btn btn-primary">
</form>
@endsection
  

Я получаю следующую ошибку:
Missing required parameters for [Route: posts.update] [URI: posts/{post}]. (View: C:xampphtdocsblogresourcesviewspostsedit.blade.php)

Похоже, я неправильно отправляю параметр id.

Кроме того, как я могу воссоздать эту часть: {{Form::hidden('_method', 'PUT')}} в обычном HTML?

Ответ №1:

Вы можете воссоздать method входные данные с помощью этого:

 @method('PUT')
  

Вам нужно поместить $post->id внутрь route() и использовать подмену метода формы ( @method('PUT') ). Попробуйте это:

 @extends('layouts.app')
@section('content')
    <h1>Edit post</h1>
    <form action="{{ route('posts.update', $post->id) }}" method="POST">
    @csrf
    @method('PUT')
    <div class="form-group">
        <label for="title">Title</label>
        <input class="form-control" type="text" id="title" name="title" value={{$post->title}}>
    </div>
    <div class="form-group">
        <label for="body">Body</label>
        <textarea class="form-control" id="body" rows="3" name="body" value={{$post->body}}></textarea>
    </div>
    <input type="submit" class="btn btn-primary">
</form>
@endsection

  

Ответ №2:

Ваша ошибка вызвана тем, что вы $post->id находитесь за пределами route() функции.

Изменение:

 route('posts.update'), $post->id
  

Для:

 route('posts.update', $post)
  

Что касается второго вопроса, вот как Form::hidden('_method', 'PUT') отображается в формате HTML:

 <input type="hidden" name="_method" value="PUT">
  

Но вы можете использовать @method , если предпочитаете более короткий способ его написания:

 <form action="{{ route('posts.update', $post) }}" method="POST">
    @method('PUT')
    @csrf
    ...
</form>