我正在为一个项目使用Laravel 4,但遇到了一个问题。我不确定,我做错了什么。
详细信息:
- 表单被张贴到控制器的保存功能中
- 当验证失败时,我将重定向到create函数
- 重定向后(使用
Redirect::to(somewhere)->withErrors($validator)->withInput()
):- 验证错误显示正确(如果有)
- 输入::old()为空(它应该包含以前提交的数据)
在控制器中创建功能
public function create()
{
$this->scripts[] = 'various js path here';
return View::make('admin.modules.events.create', array(
// Loading various scripts specified in this function
'scripts' => $this->scripts,
));
}
在视图中:
...
{{ Form::bsInput('event_name', 'Event title', 'event title goes here', $error = (($errors->has('event_name')) ? $errors->get('event_name') : false), $type = 'text', Input::old('event_name')) }}
...
注意:bsInput
是Form::Input()的包装器,用于创建引导程序控件和标签
控制器:
public function save()
{
if (Input::has('submitEventSave'))
{
$event = Mihirevent::find(Input::get(event_id));
$event_add = false;
}
else
{
$event = new Mihirevent();
$event_add = true;
}
if ($event === false)
{
// doing something else
}
else
{
$event->event_name = Input::get('event_name');
$event->event_slug = Input::get('event_slug');
$event->event_description = Input::get('event_description');
$event->event_location_text = Input::get('event_location_text');
$event->event_location_data = Input::get('event_location_data');
$event->event_status = Input::get('event_status');
$event->featured_image = Input::get('featured_image');
$event->event_date_from = Input::get('event_date_from');
$event->event_date_until = Input::get('event_date_until');
$validation_rules = $event_add === true?$event->rules:$event->update_rules;
$inputs = array(
'event_name' => $event->event_name,
'event_slug' => $event->event_slug,
'event_location_text' => $event->event_location_text,
);
$validator = Validator::make($inputs, $validation_rules);
if ($validator->fails())
{
Input::flash();
if ($event_add === true)
{
return Redirect::to('admin/event/create')
->withErrors($validator)->withInput();
}
else
{
return Redirect::to('admin/event/edit/'.$event->event_id)
->withErrors($validator)->withInput();
}
}
// save
MihirEvent::save();
// redirect to list
return Redirect::route('adminEvent');
}
}
更新:
bsInput
宏:
Form::macro('bsInput', function($name, $text, $placeholder = null, $error = false, $type = 'text', $default = null, $class=null)
{
$label = Form::label($name, $text, array('class' => 'control-label'));
$input = Form::input($type, $name, $default, array('placeholder' => $placeholder, 'class' => 'form-control'.($class?' '.$class:'')));
$error_messages = false;
if($error)
{
$error_messages = '<ol>';
foreach ($error as $value) {
$error_messages .= '<li>'.$value.'</li>';
}
$error_messages .= '</ol>';
}
$html = '<div class="form-group'.(($error) ? ' has-error' : '').'">';
$html .= $label;
$html .= $input;
$html .= (($error_messages) ? '<div class="alert alert-danger">'.$error_messages.'</div>' : '');
$html .= '</div>';
return $html;
});
查看Laravel 4来源:
/**
* Flash an array of input to the session.
*
* @param array $input
* @return 'Illuminate'Http'RedirectResponse
*/
public function withInput(array $input = null)
{
$input = $input ?: $this->request->input();
$this->session->flashInput($input);
return $this;
}
看起来,如果您不传递Input with->with Input的数组,它会尝试从原始请求中提取它。试着这样修改行:
if ($event_add === true)
{
return Redirect::to('admin/event/create')
->withErrors($validator)->withInput(Input::all());
}
else
{
return Redirect::to('admin/event/edit/'.$event->event_id)
->withErrors($validator)->withInput(Input::all());
}
这应该会迫使它通过输入值数组,而不是依赖
'$this->request->input()'
仍然存在于会话中。
您先执行Input::flash()
,然后执行withInput()
,这有效地执行了两次Input::flash()
,可能会使闪存输入无效。试着只做两个中的一个。
另外,MihirEvent::save();
是错误的,你想做$event->save();
。
最后我发现了问题:在routes.php文件中,在<?php
打开标记之前有一个前导空格。(当时正在一个团队中工作,其他人添加了该空间)。