Laravel 5.6 упрощает проверку нескольких полей ввода - PullRequest
0 голосов
/ 18 сентября 2018

Я новичок в изучении Laravel и все еще пытаюсь освоить красивое кодирование.

У меня есть такой код, который проверяет поля ввода при отправке формы обновления, и он содержит много ненужных кодов, которые можно изменить, чтобы сделать его коротким и лучшим.

Поэтому мой вопрос таков:какой подход или методику я должен использовать, чтобы переписать мои коды, чтобы они были короткими и красивыми.

public function update(Request $request, $id)
    {
        $product = Product::find($id);

        if ($product->name != $request->name AND $product->sku != $request->sku AND $product->description != $request->description) {
            $this->validate($request, [
                'name' => 'required|unique:products,name',
                'sku' => 'required|unique:products,sku',
                'description' => 'required'
            ]);
        } elseif ($product->name != $request->name AND $product->sku != $request->sku) {
            $this->validate($request, [
                'name' => 'required|unique:products,name',
                'sku' => 'required|unique:products,sku'
            ]);
        } elseif ($product->name != $request->name AND $product->description != $request->description) {
            $this->validate($request, [
                'name' => 'required|unique:products,name',
                'description' => 'required'
            ]);
        } elseif ($product->description != $request->description AND $product->sku != $request->sku) {
            $this->validate($request, [
                'description' => 'required',
                'sku' => 'required|unique:products,sku'
            ]);
        } elseif ($product->name != $request->name) {
            $this->validate($request, [
                'name' => 'required|unique:products,name'
            ]);
        } elseif ($product->description != $request->description) {
            $this->validate($request, [
                'description' => 'required'
            ]);
        } elseif ($product->sku != $request->sku) {
            $this->validate($request, [
                'sku' => 'required|unique:products,sku'
            ]); 
        } else {
            return redirect('products/' . $product->id)->with('info', 'Product does not changed!'); 
        }

    }

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Похоже, у вас есть две проблемы, которые вам нужно решить, чтобы сократить код:

  • 1) Поля названия продукта и sku обязательны, но вы хотите избежать конфликтов со значениями, которые существуют напродукт, который вы планируете обновить.
  • 2) Поле описания фактически не требуется, но когда оно присутствует, оно не должно проверяться.(не должно ли быть min:1 проверка или что-то в этом роде?)

Так что, чтобы решить # 1, вам нужно написать собственное правило unique, чтобы игнорировать текущую $product, которую вы пытаетесьобновить при определении уникального значения.См. Формирование уникального правила игнорирования данного идентификатора - Документы Laravel

И для решения # 2 вы можете использовать sometimes проверка Условно добавленные правила - Документы Laravel

Комбинируя их, вы должны использовать одно утверждение проверки, например:

use Illuminate\Validation\Rule;

...

$this->validate($request, [
    'name' =>  [
         'required',
         Rule::unique('products')->ignore($product->id)
    ],
    'sku' => [
         'required',
         Rule::unique('products')->ignore($product->id)
    ],
    'description' => Rule::sometimes('description', 'required', function($input){
        return $input->description !== $product->description;
    });
]);

Если это не так, пожалуйста, обновите этот ответ для следующего человека, который оступится.Надеюсь, что это поможет.

[Подсказка:] Это кажется длинным выстрелом, но если поле описания представляет собой поле WYSIWYG на интерфейсе клиента, я бы сделал так, чтобы они достигли максимальной длины текстового поля, поскольку они могут преобразовывать изображенияв base64, так что, хотя это маловероятно для большинства ситуаций, я пытаюсь включить max:65535 в проверку, чтобы она не удалась.(65535 - максимальная длина текстового поля MySQL, другие базы данных имеют разные размеры)

0 голосов
/ 18 сентября 2018

Вы можете сделать форму с необходимыми, и они сделают проверку для них.

 <form method="post" action="url">
      <input type="text" name="username" required>
 </form>

и сделать валидатор в контроллере.

Like This

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...