2016-02-04 2 views
7

Я пытаюсь проверить поле пароля только в том случае, если оно присутствует. Я хочу разрешить кому-либо редактировать пользователя, и они могут или не хотят изменять пароль пользователей. Поэтому я думал, что могу это использовать правила валидации Laravels, в частности правило «иногда». У меня есть этот набор правил:Laravel иногда правило проверки

$this->validate($request, [ 
    'password' => 'sometimes|required|min:8', 
]); 

Это упрощено для примера, как правило, будут другими правилами для других областей и более строгих правил для пароля. Я ожидаю, что это применит правило min: 8, только если поле пароля присутствует в переданных данных, но если я покину поле пароля пустым, я получу ошибку проверки, указывающую, что требуется поле пароля.

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

$data = $request->all(); 

if ('' === $data['password']) { 
    unset($data['password']) 
} 

... а затем передать массив в валидатор. Я думаю, что это имеет смысл, но я могу сделать с некоторым подтверждением, что я правильно понимаю. Заранее спасибо.

+0

С docs, вот что я понимаю. Таким образом, в основном вы можете идти, если кто-либо не говорит иначе. –

+0

Также кажется, что, если вы удалите требуемое правило, оно отлично работает: «иногда | min: 8 .....», но документы на самом деле не делают этого ясно. – Steven1978

+0

Yup. это то, что я думал сначала, а затем снова проверил документы. : D –

ответ

6

Документы не дают четких данных, но удаление требуется заставляет его работать.

$this->validate($request, [ 
    'password' => 'sometimes|min:8', 
]); 
+0

Кажется очевидным, но документы направляют вас подальше от решения. Спасибо за помощь :). – Steven1978

+0

Yup, сделал это по коду, но запутался, увидев документы. рад мог помочь :) –

+0

Понимаю ли я это? Иногда правило означает, что вход является необязательным? – TheCrazyProfessor

10

Я думаю, что мы должны сказать laravel. Если пароль не пуст, установите правила, иначе ничего не сделайте.

$this->validate($request, [ 
    'password' => $request->password != null ?'sometimes|required|min:8': '' 
]); 
+0

«В приведенном выше примере поле пароля будет проверяться только в том случае, если оно присутствует в массиве $ data». из документов –

+0

@nbin Не могли бы вы ссылаться на него? –

+0

Не могли бы вы увидеть документы? –

3

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

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

Это, как правило, как я позволяю пользователя изменить пароль с Laravel:

$this->validate($request, [ 
      'user.old_password' => [], 
      'user.password' => [ 
       'required_with:user.old_password', 
       'min:6', 
       'confirmed', 
       'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*([[email protected]#$%^&*.,;?])).+$/', 
       'different:user.old_password' 
      ], 
      'user.password_confirmation' => ['required_with:user.password'], 
     ]); 

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

2

В режиме редактирования вы заполнить поле пароля, например «********» и в режиме обновления проверить, как этот

$this->validate($request, [ 
    'password' => 'required|min:8', 
]); 

и проверки контроллера $data['password']='********' найти старый пароль и

$data['password']='old password in db' 

и $data['password']!='********' обновление pssword