没有集体的Laravel形式

时间:2019-02-28 14:45:02

标签: php laravel forms laravel-blade

我正在学习Laravel。据我所知,当前的稳定版本是5.8。我正在关注教程,并且确实喜欢该框架,但是当这些教程到达介绍表单如何合并的地步时,这会有些麻烦。所有这些教程都使用LaravelCollective形式,该形式从5.8版开始不再使用,它​​是一个废弃的项目,因此我宁愿不使用它。

但是,这使我对使用Laravel使用表单的最佳实践感到困惑。我在创建表单方面花了很多功夫,但是...如果可以的话,大多数只是HTML,几乎没有Laravel在其中。这里唯一的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

这很好用,但是我只是觉得我根本没有正确使用刀片。任何指针将不胜感激。

2 个答案:

答案 0 :(得分:4)

实际上,您在这里使用的Laravel不仅仅是form action@csrf代表Cross-site request forgery,这是保护您免受侵害的幼稚方式,如文档所述:

  

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

     

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

当您拥有PUT, PATCH OR DELETE表单时,应使用Blade指令@method来告知laravel应该使用的操作:

  

HTML表单不支持PUT,PATCH或DELETE操作。因此,在定义从HTML表单调用的PUT,PATCH或DELETE路由时,您将需要向表单添加一个隐藏的_method字段。通过_method字段发送的值将用作HTTP请求方法:

您可以轻松实现,只需使用:


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

除此之外,我认为您使用的是laravel / blade。确保您阅读了docs,以了解更多信息。

祝你好运!

答案 1 :(得分:1)

您所拥有的是一个很好的起点,但是值得一看的另一个地方是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将使用bootstrap-4错误样式“修饰”该字段。
  • {{ old('text') }}将使用先前填充的值预填充输入,以防表单验证失败并且用户被重定向回同一页面。

这将有助于改善用户体验,但是请记住,这些都是服务器端工具(因为Laravel是服务器端框架),因此添加客户端检查和验证可能是更好的用户体验。