如何在 Laravel 或其他框架中正确编写表单?
Posted
技术标签:
【中文标题】如何在 Laravel 或其他框架中正确编写表单?【英文标题】:How to properly write a form in Laravel or other frameworks? 【发布时间】:2019-06-17 09:27:57 【问题描述】:我对 Laravel 还很陌生,但我已经阅读了有关 validation 和 Laravel Collective 的内容。我觉得这些方法很麻烦,因为验证是在不同的层次上进行的:
数据库验证(外键约束、列类型) 模型验证(通过set...Attribute
方法)
请求特征的验证
前端验证(例如Bootstrap)
例如,我想编写一个带有国家选择器的表单。我的数据库有一个VARCHAR(2)
列来接收国家代码。我必须在我的模型上编写setCountryAttribute
方法来验证接受国家/地区的价值。然后我必须编写一个表单请求php artisan make:request StoreCustomerPost
,它是setCountryAttribute
代码的部分复制粘贴。最终,我必须编写一些 javascript 来在客户端进行验证。
对大型应用程序的每种形式的每个领域都这样做是不可接受的。
我正在寻找的是涉及元编程的更优化的解决方案。例如,我可能会使用一个工具箱工厂,它可以生成所有前端 html,包括 JS 验证代码、请求验证和模型验证。
我们以age
表单域为例。我认为可以这样定义:
"age":
"type": "textfield",
"name": "age",
"validation":
"type": "integer"
"pattern": "/\d1,2|1\d2/",
"minValue": 0,
"maxValue": 122,
,
"view":
"template": "form.fields.textfield",
"placeholder": "Age",
"size": "10em",
"title": "Age",
"validation": true
这些信息足以动态生成:
模型验证setAgeAttribute
可能通过更通用的setAttribute
trait 方法。
请求验证器附加到我的控制器
前端代码。
所以在我的控制器中,我期待这样的东西:
public function edit($id)
$form = Form::fill(Customer::find($id))
->field('age');
->field('firstname');
->field('lastname');
return view('customers.edit', ['form' => $form->toBlade()]);
是否有与该提议足够接近的解决方案?
【问题讨论】:
这是一个有趣且常见的问题。我也很烦每个图书馆都有自己的验证码。您可以创建验证此对象的通用类,并在 js、模型等中使用它。例如:用户类具有属性 $validations = ... 和方法 validate。您可以将此公共对象传递给所有类并基于它们生成 javascript 代码。我不知道是否有用于 js 验证的库。您可以创建自己的或使用现有的,但可以调整您的规则以匹配 js 库规则结构 是这个吗? github.com/kristijanhusak/laravel-form-builder 【参考方案1】:我正在寻找的是涉及元编程的更优化的解决方案。例如,我可能会使用一个工具箱工厂,它可以生成所有前端 HTML,包括 JS 验证代码、请求验证和模型验证。
我感觉到你的痛苦 :-) 虽然这个问题有点宽泛,因为如果有 somewhere 你描述了这样的工具,它就不容易回答了。至少我可以说,我从未见过或听说过 Laravel 的。
在我使用 Laravel 之前,我使用 MeteorJS 进行了一个大型项目,他们有很棒的 Collection 2 package,我在 Laravel 中深深怀念它。但我认为,如果你只需要为后端和前端处理一种语言而不是两种语言,它会更容易处理。
所以我想说你必须自己做这一切,但如果有人想出一些隐藏的宝石,期待与你一起:-)
【讨论】:
【参考方案2】:先说几点:
并非所有用于验证的 PHP 函数在 Javascript 中都有对应的函数,反之亦然。 Not even regex behaves the same 两种语言。检查 regex101 是否有细微差别。
您可以只使用 xhr (ajax) 调用来进行 laravel 验证,但我同意最好通过客户端验证来防止对服务器的不必要调用。
我们可以创建自己的库来尝试反映 Laravel 对 js 进行验证的当前可能性。
有一种即将推出的技术称为webassembly which might make it possible to use PHP in the browser,并通过这种方式构建更兼容的前端验证。当然,这种前端语言还是会受到浏览器 API 的限制。
【讨论】:
以上是关于如何在 Laravel 或其他框架中正确编写表单?的主要内容,如果未能解决你的问题,请参考以下文章
如何正确地将数据从 vue 组件发布到 laravel 控制器
将 Ember-CLI 与 Laravel 或其他后端框架一起使用