Я использую Orchestra Html Form с Laravel 5.8
для создания форм для моей пользовательской CMS. Для проверки пользовательских запросов я создал класс UserRequest, в котором есть правила, сообщения и метод авторизации для проверки отправки формы. Если проверка не удалась, например, по электронной почте. происходит сбой уникальной проверки, вместо возврата к представлению с сообщениями проверки появляется ошибка: метод Orchestra\Html\Form\FormBuilder::__toString()
не должен выдавать исключение, перехвачено ErrorException: попытка получить свойство не-объекта. Я также использую форму Orchestra для других моделей, но пользователь - единственный со своим собственным пользовательским запросом и единственной моделью, которая порождает эту проблему, поэтому, я думаю, конфликт должен быть с запросом пользователя. Я не могу понять, что не так.
Я сбросил переменные в представлении, и они кажутся правильными. Метод form()
в модели также работает нормально, но когда форма отображается в представлении после ошибки проверки, происходит сбой.
"orchestra/html": "^3.5",
Laravel 5.8
МОДЕЛЬ:
public function form()
{
return Form::of('users', function ($form) {
$attributes = [
'enctype' => 'multipart/form-data'
];
$form->attributes($attributes);
$form->submit = $this->exists ? 'Guardar' : 'Criar';
$form->fieldset(function ($form) {
$form->control('select', 'role', function ($control) {
$control->field(function ($row) {
$val = old('role') ?? $this->roles()->first();
return "<select class='form-control input-with-feedback' name='role' required>".Role::selectRole($val)."</select>";
});
});
$form->control('input:text', 'nome', function ($control) {
$control->field(function ($row) {
$val = old('name') ?? $this->name ?? '';
return "<input type='text' class='form-control input-with-feedback' name='name' value='".$val."' required>";
});
});
$form->control('input:email', 'email', function ($control) {
$control->field(function ($row) {
$val = old('email') ?? $this->email ?? '';
return "<input type='email' class='form-control input-with-feedback' name='email' value='".$val."' required>";
});
});
$form->control('input:password', 'password', function ($control) {
$control->field(function ($row) {
return "<input type='password' class='form-control input-with-feedback' name='password' value='$row->password' required>";
});
});
$form->control('input:password', 'repetir password', function ($control) {
$control->field(function ($row) {
return "<input type='password' class='form-control input-with-feedback' name='password_confirmation' value='$row->password_confirmation' required>";
});
});
$form->control('input:file', 'avatar', function ($control) {
$control->field(function ($row) {
$default_img = $this->avatar ?? 0;
$val = "<input type='file' class='form-control input-with-feedback' name='avatar' ><input type='hidden' name='avatar' value='".$default_img."'>";
if ($this->avatar != NULL){
$val .= "<label class='col-md-3 control-label d-block mt-2 mb-0'>Imagem atual:</label><img src='".\CompGallery::getImageFullUrl($this->avatar, '_avatar')."'><label class='control-label mt-2 mb-0 mx-2'>Apagar Imagem</label><input type='checkbox' name='delete_image' value='on'>";
}
return $val;
});
})->label('Avatar');
$form->control('input:checkbox', 'active', function ($control) {
$control->field(function ($row) {
$val = old('active') ? 'checked' : $this->active ? 'checked' : '';
if (is_null($this->active)) $val = 'checked';
return "<label class='switch'><input type='hidden' value='0' name='active'><input type='checkbox' class='form-control input-with-feedback col-md-4' name='active' id='ativo' value='1' ".$val."><span class='slider round'></span></label>";
});
})->label('Ativo');
});
});
}
ЗАПРОС:
public function rules()
{
return [
'role' => 'required',
'name' => 'required|string|max:50',
'email' => 'required|string|email|max:50|unique:users,email,'.$this->id,
'password' => 'required|string|min:8|confirmed',
'active' => 'required',
];
}
/**
* Get the error messages for the defined validation rules.
*
* @return array
*/
public function messages()
{
return [
'name.required' => 'O nome é obrigatório',
'email.required' => 'O email é obrigatório',
'email.unique' => 'O email já existe',
'password.required' => 'A password é obrigatória',
'password.confirmed' => 'As passwords não coincidem'
];
}
ПРОСМОТР:
<div class="row">
<div class="col-md-7 module-form">
{!! $form !!}
</div>
</div>
СООБЩЕНИЕ ОБ ОШИБКЕ: Метод Orchestra \ Html \ Form \ FormBuilder :: __ toString () не должен вызывать исключение, пойман ErrorException: Попыткаполучить свойство необъекта