Требовалось обновить пользовательские роли. Роль может быть пустой (оставлено пустым), одна или несколько, как указано в поле формы 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
объект?
Вам нужно будет определить эту проблему при разработке вашего приложения.
Как отличить, когда значение поля формы HTML Post было отправлено как пустое (не отмечен здесь) или если в форме просмотра не было такого поля? Есть ли в Laravel красноречивый способ * найти / вывести список полей формы из объекта Request?
Когда эта форма не должна иметь roles[]
поле? У вас должен быть маркер, который сообщит вашему приложению, что эта форма не имеет roles[]
поле.
Примерно так: когда эта форма используется, когда обычный пользователь обновляет свой профиль, он / она не сможет обновить свои роли.
Поскольку ваша проблема действительно является поведением форм по умолчанию, как ответили на этот вопрос: Отправить HTML-форму с пустыми флажками
Так что будет другой процесс для форм, которые НЕ ИМЕЮ иметь поле ролей и другой процесс для форм, которые ИМЕТЬ поле ролей.
Чтобы добавить к своей реализации, вы можете получить поле ролей следующим образом:
$roles = $request->input('roles', []);
После чего вы можете просто использовать sync
к методу отношения вашей модели.
$user->roles()->sync($roles);
Вы можете использовать методы запроса laravel has()
или же filled()
, has
проверяет наличие параметра и filled
проверяет это присутствует а также заполнены:
if ($request->has('roles')) {
//
}
или же
if ($request->filled('roles')) {
//
}
Проверьте Документация Laravel для получения дополнительной информации о получении входных данных из объекта запроса.
РЕДАКТИРОВАТЬ
Поскольку вы используете Laravel 5.2, применяются следующие правила:
has()
метод проверяет наличие параметра а также заполнены.exists()
Метод проверки параметров присутствует.Проверьте код на репо для получения дополнительной информации.
Для этого у вас есть валидация, кажется, что вам нужно 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
}
[...]
}
попробуйте если (пусто ())
$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