首页 > 解决方案 > 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?
    }

}

标签: phplaravelformslaravel-6

解决方案


如果我是你,我会在 中创建三个类\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,该基类将保存这些过滤器共享的公共数据/方法。


推荐阅读