【问题标题】:Laravel form without Collective没有集体的 Laravel 形式
【发布时间】:2019-07-22 12:26:26
【问题描述】:

我正在学习 Laravel。据我所知,当前的稳定版本是 5.8。我正在关注教程并且非常喜欢该框架,但是当这些教程到达它们介绍如何合并表单的地步时会有点麻烦。所有这些教程都使用 LaravelCollective 表单,从 5.8 开始不再有效,而且它是一个废弃的项目,所以我不想使用它。

但这让我对在 Laravel 中使用表单的最佳实践感到困惑。我在创建表单方面做了一些尝试,但是……如果有意义的话,其中大部分只是 HTML,几乎没有任何 Laravel “在里面”。这里唯一的 Laravel 位是form action,它指向TodosController 中的store 函数。请参见下文,获取名为 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

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

【问题讨论】:

  • 您可以将表单输入提取到刀片组件等,但公平地说,这比使用像样的 IDE 做的工作要多。这对我来说看起来非常好
  • 我也是这么想的。至少可以放心,我并没有以某种完全无意的方式这样做,谢谢。
  • 如果我错了,请纠正我,但由于它是一个字符串,这不会起作用吗?动作="{{动作('TodosController@store')}}"。不应该没有引号吗?

标签: php laravel forms laravel-blade


【解决方案1】:

你所拥有的是一个很好的起点,但是另一个值得一看的地方是boilerplate registration form(这不是来自官方 Laravel 项目页面,因为样板是可选的,并且不在官方默认为 repo)。

您可以在此基础上进行一些改进:

 <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-&gt;has('text') ? ' is-invalid' : '' }} 将使用 bootstrap-4 错误样式“装饰”该字段(因此将 $errors 变量传递给视图)
  • {{ old('text') }} 将使用先前填写的值预填充输入,以防表单验证失败并且用户被重定向回同一页面。

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

【讨论】:

    【解决方案2】:

    实际上,您在那里使用的 laravel 不仅仅是 form action@csrf 代表 Cross-site request forgery,这是 laravel 保护您免受这种情况的方式,如文档中所述:

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

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

    当你有一个 PUT, PATCH OR DELETE 表单时,你应该使用刀片指令 @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 了解更多信息。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2019-03-22
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 2018-09-02
      • 1970-01-01
      • 2019-06-01
      • 2016-02-14
      相关资源
      最近更新 更多