Как Laravel может проверить, если в запросе POST поле оставлено пустым?

Требовалось обновить пользовательские роли. Роль может быть пустой (оставлено пустым), одна или несколько, как указано в поле формы roles[],

Вот форма просмотра:

@foreach ($roles as $role)
<div class="checkbox">
<label><input name="roles[]" type="checkbox" value="{{$role->id}}" {{ $user->roles->contains($role->id) ? 'checked' : '' }}>{{$role->name}}</label>
</div>
@endforeach

Состояние внутри UserController :: обновление () является:

if ($request->roles) {
// update user roles
}

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

if($request->roles), isset($request->roles), а также !empty($request->roles) .. все дают один и тот же старомодный ответ (null, '', true/flase).

Случай: когда назначена одна или несколько ролей:

  +request: ParameterBag {#41 ▼
#parameters: array:6 [▼
"_method" => "PUT""_token" => "a8oIPQFBMbhjanikX8v83qeOcfRE0N4UKTcTQDig""name" => "New User Name""email" => "[email protected]""password" => """roles" => array:2 [▼
0 => "2"1 => "3"]
]
}

Случай: когда нет назначенной роли ИЛИ необходимо удалить (отсоединить) ранее назначенную роль:

  +request: ParameterBag {#41 ▼
#parameters: array:5 [▼
"_method" => "PUT""_token" => "a8oIPQFBMbhjanikX8v83qeOcfRE0N4UKTcTQDig""name" => "New User Name""email" => "[email protected]""password" => ""]
}

Итак, вопрос (требование):

Как отличить, когда значение поля формы HTML Post было отправлено как пустое (не отмечен здесь) или если в форме просмотра не было такого поля?
Есть ли в Laravel красноречивый способ * найти / перечислить поля формы из Request объект?

[PS: Попробовать другое скрытое поле или сделать какой-нибудь внешний интерфейс jQuery не приветствуется]

3

Решение

Вам нужно будет определить эту проблему при разработке вашего приложения.

Как отличить, когда значение поля формы HTML Post было отправлено как пустое (не отмечен здесь) или если в форме просмотра не было такого поля? Есть ли в Laravel красноречивый способ * найти / вывести список полей формы из объекта Request?

Когда эта форма не должна иметь roles[] поле? У вас должен быть маркер, который сообщит вашему приложению, что эта форма не имеет roles[] поле.

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

Поскольку ваша проблема действительно является поведением форм по умолчанию, как ответили на этот вопрос: Отправить HTML-форму с пустыми флажками

Так что будет другой процесс для форм, которые НЕ ИМЕЮ иметь поле ролей и другой процесс для форм, которые ИМЕТЬ поле ролей.

Чтобы добавить к своей реализации, вы можете получить поле ролей следующим образом:

$roles = $request->input('roles', []);

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

$user->roles()->sync($roles);
2

Другие решения

Вы можете использовать методы запроса laravel has() или же filled(), has проверяет наличие параметра и filled проверяет это присутствует а также заполнены:

if ($request->has('roles')) {
//
}

или же

if ($request->filled('roles')) {
//
}

Проверьте Документация Laravel для получения дополнительной информации о получении входных данных из объекта запроса.

РЕДАКТИРОВАТЬ

Поскольку вы используете Laravel 5.2, применяются следующие правила:

  • has() метод проверяет наличие параметра а также заполнены.
  • exists() Метод проверки параметров присутствует.

Проверьте код на репо для получения дополнительной информации.

3

Для этого у вас есть валидация, кажется, что вам нужно roles поле быть required а также exists(для сопоставления с определенной таблицей)

Вам просто нужно сделать валидатор с помощью команды artisan и внедрить его в метод контроллера, посмотрите документы.

например:
php artisan make:request MyCustomRequest
Тогда у вас должен быть файл запроса под: App\Http\Requests
Вам необходимо установить правила проверки, как описано выше:

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class MyCustomRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}

/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'rules' =>'required|exists:tour_roles_table,id'
];
}
}

Затем вы можете использовать его в нужном вам методе:

class UserController extends Controller {
[...]
public function update(MyCustomRequest $req)
{
[...]
//at this point validation was successfull, by default Laravel will redirect back with error messages, which can be customized in your request object
}
[...]
}
1

попробуйте если (пусто ())

$check = request::get('roles');

if(empty($checkbox)){
//if checkbox have a empty value do ...
}else{
//if checkbox have not empty value do ..
}

для получения дополнительной информации нажмите http://php.net/manual/en/function.empty.php

0
По вопросам рекламы [email protected]