【问题标题】:laravel 4 Input::old() is emptylaravel 4 输入::old() 为空
【发布时间】:2014-05-28 15:19:39
【问题描述】:

我在一个项目中使用 Laravel 4,但遇到了问题。我不确定,我做错了什么

详情:

  • 表单已发布到控制器的保存功能。
  • 当验证失败时,我将重定向到创建函数
  • 重定向后(使用Redirect::to(somewhere)->withErrors($validator)->withInput()):
    • 正确显示验证错误(如果有)
    • Input::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;
});

【问题讨论】:

  • 你确定 Input::old() 是空的,还是它没有显示在你想要的表单输入中?
  • 用var_dump/dd检查过,是空的
  • 重定向前可以,重定向后为空
  • 这很奇怪,因为 withError() 函数工作正常
  • 我也尝试过 Input::flash(),结果相同

标签: php input laravel-4


【解决方案1】:

最后我发现了问题:routes.php 文件中有一个前导空格,在&lt;?php 开始标记之前。 (当时正在一个团队中工作,其他人添加了该空间)。

【讨论】:

  • 这对旧输入有何影响
  • 旧输入使用 session 进行存储,并且前导空格(在 php 标记之前)是输出干扰 session(标头已由错误发送)
【解决方案2】:

您正在执行Input::flash(),然后是withInput(),这实际上执行了两次Input::flash(),可能会使闪烁的输入无效。尝试只做两者之一。

另外,MihirEvent::save(); 是错的,你想做$event-&gt;save();

【讨论】:

  • 那么我建议你尝试在一个空白的新项目中使用尽可能少的代码重新创建问题。
  • 我稍后会尝试。
  • 它适用于新的 laravel 安装,但我仍然无法弄清楚为什么这不适用于此控制器(其余控制器运行良好)
【解决方案3】:

查看 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;
}

看起来如果你不通过 ->withInput 传递一个 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()'

仍然存在于会话中。

【讨论】:

  • 这是一条有趣的道路,但仍然行不通。 Flash 数据仍然丢失。
  • 很奇怪。您是否能够验证 Input:all() 或您通过的 w/e 是否具有您想要的值?
  • 另外,您是否尝试过手动将数据存储在会话中,然后从视图中的会话中检索数据?
  • Input::all() 包含重定向前的数据,只有闪存数据丢失(任何闪存数据,而不仅仅是输入)。也尝试在会话中存储数据,但工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 2013-06-08
  • 2021-01-21
  • 2013-08-06
  • 1970-01-01
  • 2016-12-30
  • 2014-11-21
相关资源
最近更新 更多