Есть запрос формы UpdateUserRequest, который проверяет значение полей на соответствие правилам, определенным в методе rules. По умолчанию он имеет методы rules () и authorize (). я хочу предотвратить проверку и обновление пустых полей (например, пароля).

Использование sometimes в правилах бесполезно, поскольку входные данные html будут присутствовать в запросе POST, даже если они пусты.

array:6 [▼
 "_method" => "PATCH"
 "_token" => "Cz79rRez2f6MG0tTU17nVwXD0X1lNGH1hA7OORjm"
 "name" => "john"
 "email" => "mymail@gmail.com"
 "password" => ""
 "password_confirmation" => ""

]

Поэтому я должен удалить пустые ключи запроса POST перед использованием sometimes в правилах.
вопрос: где лучше всего очистить массив запросов?
есть ли какой-либо встроенный метод laravel для управления такими ситуациями?

P.S : решение:
Решение @Bogdon по-прежнему действует и работает, но есть еще одно простое, красивое и изящное решение, заимствованное из здесь:
просто переопределить метод all() внутри запроса формы

 class RegistrationRequest extends Request
  {

...

public function all()
{
    $attributes = parent::all();

    if(isset($attributes['password']) && empty($attributes['password'])) 
        {
            unset($attributes['password']);
        }
    $this->replace($attributes);

    return parent::all();

}

...

}
9
amin 22 Фев 2016 в 23:18

2 ответа

Лучший ответ

Чтобы эта работа работала, вам необходимо изменить содержимое класса App\Http\Requests\Request, чтобы разрешить способ дезинфекции ввода (код класса взят из этот пост Laracasts):

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

abstract class Request extends FormRequest
{
    /**
     * Validate the input.
     *
     * @param  \Illuminate\Validation\Factory  $factory
     * @return \Illuminate\Validation\Validator
     */
    public function validator($factory)
    {
        return $factory->make(
            $this->sanitizeInput(), $this->container->call([$this, 'rules']), $this->messages()
        );
    }

    /**
     * Sanitize the input.
     *
     * @return array
     */
    protected function sanitizeInput()
    {
        if (method_exists($this, 'sanitize'))
        {
            return $this->container->call([$this, 'sanitize']);
        }

        return $this->all();
    }
}

После этого вам просто нужно написать метод add sanitize в классе UpdateUserRequest, который удаляет поле password из ввода, когда оно пусто:

public function sanitize()
{
    if (empty($this->get('password'))) {
        // Get all input
        $input = $this->all();
        // Remove the password field
        unset($input['password']);
        // Replace the input with the modified one
        $this->replace($input);
    }

    return $this->all();
}

Теперь использование правила sometimes для поля пароля будет работать:

public function rules()
{
    return [
        // Other rules go here
        'password' => 'sometimes|required|confirmed'
    ];
}
4
Bogdan 22 Фев 2016 в 22:07

Я не уверен, как лучше всего очистить поля, но в настоящее время я обрабатываю обновления пользователей в своей системе именно так.

Я нахожу пользователя на основе прошедшего $id и затем обновляю соответствующие записи. Я предполагаю, что name и email никогда не будут пустыми, может быть пустым только пароль, поэтому мы можем просто установить поля name и email в значения передаются, а затем с помощью оператора if проверяют, является ли поле password пустым или нет, и обновляют его соответствующим образом.

Что-то вроде этого я использую:

public function update($id)
    {
        $user = User::find($id);

        $user->name   = Input::get('name');
        $user->email      = Input::get('email');
        if (Input::get('password') != "")
        {
        $user->password   = Hash::make(Input::get('password'));
        }

        $user->save();
    }
0
James 22 Фев 2016 в 20:33