使用HTML表单存储到资源(Laravel 5.8)

时间:2019-03-06 09:14:41

标签: php laravel forms

我正在创建一个允许用户创建博客帖子的laravel应用程序。

我已经创建了一个PostsController作为具有存储功能的资源,如下所示:

public function store(Request $request)
{
    $this->validate($request, [
        'title' => 'required',
        'body' => 'required'
    ]);

    return 123;
}

此外,我在web.php中添加了一条路线

Route::resource('posts', 'PostsController');

如果我使用php artisan php artisan show:routes列出路由,则会列出POST方法:

enter image description here

HTML表单如下:

<form action="PostsController@store" method="POST">        
    <div class="form-group">
        <label for="title">Title</label>
        <input class="form-control" type="text" id="title">
    </div>
    <div class="form-group">
        <label for="body">Body</label>
        <textarea class="form-control" id="body" rows="3"></textarea>
    </div>
    <input type="submit" class="btn btn-primary">
</form>

提交表单时,出现MethodNotAllowedHttpException:

The POST method is not supported for this route. Supported methods: GET, HEAD, PUT, PATCH, DELETE.

我以前曾经使用laravel集体形式。 laravel有一段时间没有做任何工作,现在似乎已弃用(https://laravelcollective.com/),因此我求助于经典HTML形式。我该如何解决?

2 个答案:

答案 0 :(得分:4)

您的操作在表单中不正确-您需要将操作指向路由的URL,然后路由将选择方法,在这种情况下为“存储”方法。另外,添加@csrf以获得更多信息CSRF Protection

<form action="{{ route('posts.store') }}" method="POST">
   @csrf        
    <div class="form-group">
        <label for="title">Title</label>
        <input class="form-control" type="text" id="title">
    </div>
    <div class="form-group">
        <label for="body">Body</label>
        <textarea class="form-control" id="body" rows="3" name="body"></textarea>
    </div>
    <input type="submit" class="btn btn-primary">
</form>

答案 1 :(得分:1)

在文本框和文本区域中添加名称

form action="{{ route('posts.store') }}" method="POST">
       @csrf        
        <div class="form-group">
            <label for="title">Title</label>
            <input class="form-control" type="text" id="title" name="title">
        </div>
        <div class="form-group">
            <label for="body">Body</label>
            <textarea class="form-control" id="body" rows="3" name="body"></textarea>
        </div>
        <input type="submit" class="btn btn-primary">
    </form>