代码之家  ›  专栏  ›  技术社区  ›  Tienus McVinger

无集体的拉维形式

  •  0
  • Tienus McVinger  · 技术社区  · 6 年前

    我在学拉威尔。据我所知,目前的稳定版本是5.8。我正在学习教程,非常喜欢这个框架,但是当这些教程介绍如何合并表单时,会有点麻烦。所有这些教程都使用LaravelCollective表单,它从5.8开始就不再工作了,它是一个废弃的项目,所以我还是不想使用它。

    但这让我很困惑,在Laravel中使用表单的最佳实践是什么。我曾经尝试过创建表单,但是。。。如果这有意义的话,大部分都是HTML,几乎没有任何Laravel“在那里”。这里唯一的一个拉威尔位是 form action ,它指向 store TodosController . 有关名为 create.blade.php

    @extends('layouts.app')
    
    @section('content')
        <h1>Create Todo</h1>
        <form action="{{action('TodosController@store')}}" method="post">
            @csrf
            <div class="form-group">
                <label for="text">Text</label>
                <input type="text" name="text" class="form-control" placeholder="Enter title"/>
            </div>
            <div class="form-group">
                <label for="body">Body</label>
                <textarea class="form-control"  name="body" id="body" rows="10" placeholder="Enter details"></textarea>
            </div>
            <div class="form-group">
                <label for="due">Due date</label>
                <input type="text" name="due" class="form-control" placeholder="Enter due date"/>
            </div>
            <input type="submit" value="Submit" class="btn btn-primary">
        </form>
    @endsection
    

    这很好,但我只是觉得我在这里并没有正确使用刀片。任何指点都将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  5
  •   Community CDub    4 年前

    事实上,你在那里使用的laravel比 form action . 这个 @csrf 代表 Cross-site request forgery 正如文档中所说,这是一种保护您免受伤害的拉威尔方式:

    Laravel会自动为应用程序管理的每个活动用户会话生成一个CSRF“令牌”。此令牌用于验证经过身份验证的用户是否是实际向应用程序发出请求的用户。

    在应用程序中定义HTML表单时,应在表单中包含隐藏的CSRF令牌字段,以便CSRF保护中间件可以验证请求。您可以使用@csrf Blade指令生成令牌字段:

    当你有一个 PUT, PATCH OR DELETE 您应该使用blade指令 @method 为通知wich action laravel,应使用:

    HTML表单不支持放置、修补或删除操作。因此,在定义从HTML表单调用的PUT、PATCH或DELETE路由时,需要向表单中添加隐藏的_方法字段。与_method字段一起发送的值将用作HTTP请求方法:

    您只需使用以下方法即可实现:

    
        <form action="/foo/bar" method="POST">
        @method('PUT')
        @csrf
        </form>
    

    docs 更多信息。

    祝你好运

        2
  •  1
  •   apokryfos    6 年前

    你有一个很好的出发点,但是另一个值得一看的地方是 boilerplate registration form (这不是来自正式的Laravel项目页面,因为样板是可选的,默认情况下不在正式回购中)。

     <div class="form-group">
         <label for="text">{{__('Text')}}</label>
         <input type="text" name="text" class="form-control{{ $errors->has('text') ? ' is-invalid' : '' }}" value="{{ old('text') }}"placeholder="Enter title"/>
     </div>
    

    临时演员:

    • __('Text') Text 基于选定的区域设置和可用的语言资源。
    • {{ $errors->has('text') ? ' is-invalid' : '' }} 如果服务器端验证失败(因此通过了 $errors 变量(添加到视图中)
    • {{ old('text') }} 如果表单验证失败并且用户被重定向回同一页面,将使用以前填写的值预填充输入。