Laravel 6 寻找有关如何解决表单开关问题的提示

Laravel 6 looking for tips on how to approach a problem with form switches

我大约 2 个月前开始开发我的第一个 Laravel 6 网络应用程序。

我被困在这个问题上太久了,我正在寻找一些关于我应该从哪个角度看待这个问题的提示:

问题 我的 blade 视图中有一个表单,它有一个用于用户输入的文本区域,3 switches/checkboxes,一个按钮和一个用于输出的禁用文本区域字段(目前只是输出的占位符)。

This is how the form looks like

用户可以在 textarea 输入字段中粘贴域列表,并且取决于选中的 switches/checkboxes,请求(由于控制器中的 preg_split 现在是一个数组)必须通过所有检查的 switches/checkboxes 逻辑。我看着这些开关就像它们是过滤器。

问题 基本上,我正在 never-ending 搜索有关如何定义这些开关的任何提示。我已经研究了表单请求验证,但似乎不需要解决这个问题(我知道我稍后会用它来完成并且不会在用户输入字段中留下任何未解决的问题)。

现在,我有一个在控制器中调用的 class(ListsCleaner.php) 方法(过滤器)来响应来自视图的请求,我认为我正在以正确的方式前进,我只是不知道如何开始在其中编写每个开关逻辑(switch1,switch2,switch3):

class ListsCleaner
{
    protected $domains;

    function __construct($domains)
    {
        $this->domains = $domains;
    }

    public function filters()
    {
        // Should I write all 3 switches/checkboxes logic here?
    }

}

我的controller.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 class

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 中创建三个 classes,并相应地命名它们(class Filter1,class Filter2)。然后在每个 class 上我都会有一个包含逻辑的 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 扩展一个基础 class App\Models\Filters\AbstractFilter,这将保持 data/methods 这些过滤器共享。