Laravel 6 ищет советы о том, как решить проблему с переключателями форм - PullRequest
0 голосов
/ 03 ноября 2019

Я начал работать над своим первым веб-приложением Laravel 6 около 2 месяцев назад.

Я слишком долго застрял в этом, и я ищу несколько советов о том, под каким углом я должен смотретьпри этой проблеме:

Проблема В моем виде лезвия есть форма с текстовой областью для пользовательского ввода, 3 переключателями / флажками, кнопкой и отключенным полем текстовой области для вывода (простозаполнитель для вывода на данный момент).

Так выглядит форма

Пользователь может вставить список доменов в поле ввода textarea и зависит откакие переключатели / флажки отмечены, запрос (который теперь является массивом благодаря preg_split в контроллере) должен пройти через всю проверенную логику переключателей / флажков. Я смотрю на эти переключатели так, будто они являются фильтрами.

Вопрос По сути, я нахожусь в бесконечном поиске подсказок о том, как мне подходить к определению этих переключателей. Я посмотрел на проверку запроса формы, но это, кажется, не нужно для решения этой проблемы (я знаю, что буду использовать его позже, чтобы закончить и не оставлять пустых мест в полях пользовательского ввода).

Теперь у меня есть метод класса (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?
    }

}

My controller.php

public function filter(Request $request)
{
    $domains = preg_split('/\\s/', $request->input('domains'));
    dd ($domains);
    return new ListsCleaner($domains);
}

dd ($ domains);

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?
    }

}

1 Ответ

0 голосов
/ 03 ноября 2019

На вашем месте я бы создал три класса в \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, который будет содержать общие данные / методы, используемые этими фильтрами.

...