php - Laravel 6 寻找有关如何解决表单开关问题的提示
问题描述
大约 2 个月前,我开始开发我的第一个 Laravel 6 网络应用程序。
我在这方面被困太久了,我正在寻找一些关于我应该从什么角度看待这个问题的提示:
问题 在我的刀片视图中有一个表单,它有一个用于用户输入的文本区域、3 个开关/复选框、一个按钮和一个用于输出的禁用文本区域字段(目前只是输出的占位符)。
用户可以在 textarea 输入字段中粘贴域列表,并且取决于选中了哪些开关/复选框,请求(由于preg_split
控制器中现在是一个数组)必须经过所有选中的开关/复选框逻辑。我看着这些开关,就像它们是过滤器一样。
问题 基本上,我一直在寻找关于如何定义这些开关的任何提示。我已经研究过表单请求验证,但似乎不需要解决这个问题(我知道我稍后会用它来完成并且不会在用户输入字段中留下任何松散的结尾)。
现在,我有一个在控制器中调用的类(ListsCleaner.php)方法(过滤器)来响应来自视图的请求,我认为我正在以正确的方式前进,我只是不知道如何开始写作那里的每个开关逻辑(开关1,开关2,开关3):
class ListsCleaner
{
protected $domains;
function __construct($domains)
{
$this->domains = $domains;
}
public function filters()
{
// Should I write all 3 switches/checkboxes logic here?
}
}
我的控制器.php
public function filter(Request $request)
{
$domains = preg_split('/\\s/', $request->input('domains'));
dd ($domains);
return new ListsCleaner($domains);
}
dd($域);
array:5 [▼
0 => "website1.com"
1 => ""
2 => "website2.com"
3 => ""
4 => "website3.com"
]
我的blade.php 视图
<form class="col s12 center-align" method="get" enctype="multipart/form-data" action="{{ route('filters') }}">
{{csrf_field()}}
<div class="row">
<!-- Switches -->
<div class="switch col 4 valign-wrapper">
<label>
<input checked type="checkbox" name="Switch1" value="true">
<span class="lever"></span>
gTLDs
</label>
</div>
<div class="switch col 4 valign-wrapper">
<label>
<input checked type="checkbox" name="Switch2" value="true">
<span class="lever"></span>
Competitors
</label>
</div>
<div class="switch col 4 valign-wrapper">
<label>
<input checked="checked" type="checkbox" name="Switch3" value="true">
<span class="lever"></span>
Blogspam Sites
</label>
</div>
</div>
<div class="row">
<div class="col s6 input-field">
<textarea name="domains" id="batch_requests" class="materialize-textarea" rows="5" oninput="changedValue()"></textarea>
<label for="batch_requests">Enter URLs separated by space or line break.</label>
</div>
<div class="col s6 input-field">
<textarea disabled name="domains_cleaned" class="materialize-textarea" rows="5" oninput="changedValue()"></textarea>
</div>
</div>
<div class="row">
<div class="col s6 left-align">
<button type="submit" class="btn btn-large waves-effect waves-light white-text">Clean Websites</button>
</div>
</div>
</form>
最后,我的完整 ListsCleaner 课程
namespace App\Lists;
class ListsCleaner
{
protected $domains;
function __construct($domains)
{
$this->domains = $domains;
}
public function filters()
{
// Should I write all 3 switches/checkboxes logic here?
}
}
解决方案
如果我是你,我会在 中创建三个类\App\Models\Filters
,并相应地命名它们(Filter1 类,Filter2 类)。然后在每个类上我都有一个filter($list)
包含逻辑的方法。
在控制器上,我有一个属性:
$filters = [
'filter1' => App\Models\Filters\Filter1,
'filter2' => App\Models\Filters\Filter2,
'filter3' => App\Models\Filters\Filter3,
];
然后最后在控制器操作上,您可以遍历这些操作并检查用户选择了哪些操作:
foreach($this->filters as $filterName => $class) {
if($request->has($filterName)) {
$list = (new $class)->filter($list);
}
}
这将允许您运行所有三个(或更多)过滤器,同时将它们的逻辑放在单独的位置,这有利于代码结构。
作为奖励,您可以让 Filter1、Filter2 和 Filter3 扩展一个基类App\Models\Filters\AbstractFilter
,该基类将保存这些过滤器共享的公共数据/方法。
推荐阅读
- amazon-web-services - 在对 AWS 代理 Lambda 的 API Gateway 请求中,isBase64Encoded 始终为 false
- css - Angular/CSS:不采取格式
- bash - 比较两个文件并在末尾追加差异
- c - pthread_cond_wait 无限期地阻塞(睡眠),直到 pthread_cond_signal 被 C 中的另一个线程调用?
- javascript - 即使在用户单击它以触发功能之前,我的元素也会不断显示(点击功能)
- javascript - 如何从谷歌地图 URL 获取位置地址?
- ios - 如何创建模型类以及如何与 tableview 中的部分一起使用
- python - 如何在函数中设置限制
- jmeter - 按比例因子缩放线程数
- javascript - 在javascript中的矩阵中删除随机数量的数字