【发布时间】:2015-08-27 15:34:30
【问题描述】:
编辑
这个问题已经解决了,但我不明白为什么答案有效。
我想知道为什么它不起作用。
有没有人可以解释一下?
原始问题
我卡在设置表单上,我的问题是在设置表单中您可以输入一些电子邮件设置,但您也可以更改密码。
电子邮件设置和密码重置有效,我的表单使用当前用户的数据自行填写。 但是当表单验证失败时,它会将我重定向回没有表单数据的表单。
我不确定我是否说清楚了,但下面的代码会解释它。
ChangeUserSettingRequest.php
class ChangeUserSettingsRequest extends Request {
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
if (\Auth::check()) {
return true;
}
return false;
}
/**
* Get the validation rules that apply to the request.
*
* WHEN THIS VALIDATION FAILS IT GOES BACK TO SETTINGS.BLADE.PHP
* BUT IT DOES NOT KEEP THE SETTINGS DATA IN THE FORM
*/
public function rules()
{
return [
'current_password' => 'sometimes|required_with:password',
'password' => 'required_with:current_password|min:8|confirmed',
'password_confirmation' => 'required_with:password',
];
}
}
settings.blade.php
{!! Form::model($settings, array('url' => route('store.settings'), 'class' => 'col s12')) !!}
<p>@lang('forms.info.settings')</p>
<div class="input-field col s12 m6 l6">
{!! Form::checkbox('info_mail', 0, false, ['id' => 'info_mail']) !!}
{!! Form::label('info_mail', Lang::get('forms.newsletter'), ['for' => 'info_mail']) !!}
</div>
<div class="input-field col s12 m6 l6">
{!! Form::checkbox('message_notification', 0, false, ['id' => 'message_notification']) !!}
{!! Form::label('message_notification', Lang::get('forms.messages'), ['for' => 'message_notification']) !!}
</div>
<div class="input-field col s12 m6 l6">
{!! Form::checkbox('friend_notification', 0, false, ['id' => 'friend_notification']) !!}
{!! Form::label('friend_notification', Lang::get('forms.friendrequest'), ['for' => 'friend_notification']) !!}
</div>
<div class="input-field col s12 m6 l6">
{!! Form::checkbox('item_notification', 0, false, ['id' => 'item_notification']) !!}
{!! Form::label('item_notification', Lang::get('forms.reactiononitem'), ['for' => 'item_notification']) !!}
</div>
@if ($settings and $settings->google_maps !== null)
<div class="settings-explain">
<p class="margin-top-20">@lang('forms.info.companysettings')</p>
</div>
<div class="input-field col s12 m6 l6">
{!! Form::checkbox('type', 0, false, ['id' => 'type']) !!}
{!! Form::label('type', Lang::get('forms.companytype'), ['for' => 'type']) !!}
</div>
<div class="input-field col s12 m6 l6">
{!! Form::checkbox('google_maps', 0, false, ['id' => 'google_maps']) !!}
{!! Form::label('google_maps', Lang::get('forms.companymap'), ['for' => 'google_maps']) !!}
</div>
@endif
<div class="settings-explain">
<p class="margin-top-20">@lang('forms.info.changepassword')</p>
</div>
<div class="input-field col s12">
{!! Form::label('current_password', $errors->has('current_password') ? $errors->first('current_password') : Lang::get('forms.currentpassword'), ['for' => 'current_password']) !!}
{!! Form::password('current_password', ['class' => $errors->has('current_password') ? 'invalid' : '']) !!}
</div>
<div class="input-field col s12">
{!! Form::label('password', $errors->has('password') ? $errors->first('password') : Lang::get('forms.newpassword'), ['for' => 'password']) !!}
{!! Form::password('password', ['class' => $errors->has('password') ? 'invalid' : '']) !!}
</div>
<div class="input-field col s12">
{!! Form::label('password_confirmation', $errors->has('password_confirmation') ? $errors->first('password_confirmation') : Lang::get('forms.repeatpassword'), ['for' => 'password_confirmation']) !!}
{!! Form::password('password_confirmation', ['class' => $errors->has('password_confirmation') ? 'invalid' : '']) !!}
</div>
<div class="input-field col s12">
{!! Form::button(Lang::get('forms.save'), ['class' => 'btn waves-effect waves-light', 'type' => 'submit', 'name' => 'Save']) !!}
</div>
{!! Form::close() !!}
UserInfoController.php
/**
* Function shows the settings form
*/
public function showSettings()
{
$title = Lang::get('titles.settings');
$user_id = Auth::User()->id;
$settings = $this->settings->getUserSettings($user_id);
$companySettings = $this->companySettings->getSettings($user_id);
if ($companySettings) {
$settings->type = $companySettings->type;
$settings->google_maps = $companySettings->google_maps;
}
return view('pages.users.settings', ['title' => $title])->with(compact('settings'));
}
/**
* Function stores the setting changes
*
* ChangeUserSettingsRequest makes sure that the request is valid
*/
public function storeSettings(ChangeUserSettingsRequest $request)
{
$id = Auth::User()->id;
$success = $this->settings->handleStoreSettingsRequest($request);
// Checks if user has company settings
$hasCompanySettings = $this->companySettings->checkForSettings($id);
// If user has company settings
if ($hasCompanySettings === true) {
// Update company settings
$this->companySettings->updateSettings($request);
}
if ($success === true) {
/* Get translated message */
$message = Lang::get('toast.settingsstored');
return Redirect::route('user.profile', array(Auth::User()->permalink))->withMessage($message);
}
$settings = $this->settings->getUserSettings($id);
/* Get translated message */
$message = Lang::get('forms.error.wrongpassword');
/* This works and the form is filled with the correct data after it redirects me back */
return Redirect::back()->withErrors(array('current_password' => $message))->withSettings($settings);
}
Request.php
use Illuminate\Foundation\Http\FormRequest;
abstract class Request extends FormRequest {
//
}
所以我的问题是,在我的 UserInfoController 中,我重定向回来并且它具有良好的数据,但是当我的 ChangeUserSettingsRequest 将我重定向回来时,表单是空的。
有谁知道为什么 ChangeUserSettingsRequest 不发回数据?
- 我说的不是密码数据,而是电子邮件设置。
- 我不想制作服装验证器,因为我认为这应该可行。
请注意:当验证失败时,函数storeSettings根本不会被执行
【问题讨论】:
-
尝试替换'->withSettings($settings);'用'->withInputs();'在控制器中
-
@pinkalvansia 控制器中的部分工作正常。只是
ChangeUserSettingRequest将首先执行。如果失败,请求永远不会到达控制器。因此,当ChangeUserSettingRequest失败时,它应该将我发送回带有表单数据的表单。 -
您能否在
ChangeUserSettingsRequest失败后使用showSettings()方法中dump($request->input())的输出更新您的问题? -
@Björn 在 Laravel 5 中,当
ChangeUserSettingsRequest失败时,它永远不会到达控制器。它会自动将您发送回表单。 -
是的,我知道,
showSettings方法是表单呈现的地方吗?如果你dump($request->input())那里你可以看到所有输入数据 laravel 从 ValidationRequest 发回。
标签: php validation laravel laravel-5