验证后在控制器中获取表单输入

时间:2015-04-22 22:37:01

标签: validation laravel laravel-5

我是Laravel世界的新手,我有一个问题,到目前为止我无法解决。

我的问题是: 验证失败后,如何在控制器的create()函数中访问提交的值?

这就是我所拥有的:

  1. PostsController,在routes.php中定义为资源
  2. 在控制器中,我有通常的方法create()store()等。
  3. 以下是一些代码:

    //PostsController
    public function create()
    {
        //Here I need to get the inputs
        return view('posts.create');
    }
    
    public function store(Requests\PostsRequest $request)
    {
        //store actions
    }
    

    我创建了PostsRequest类,它有一些规则,如:

    public function rules(){
        $rules = [
            'category_id'=>'required',
            'name'=>'required|min:3',
            'description'=>'required'
        ];
        return $rules;
    }
    

    如果一切正常,则条目已存储到数据库中,但是当验证失败时,它会在create()中加载一些验证消息。 我需要在表单中加载所选类别的祖先,这应该通过知道category_id元素的提交值来实现。

    到目前为止我已尝试过:

    1. 尝试在create中添加参数:

      public function create(Requests\PostsRequest $request){...}  
      

      但它进入了无限循环。我明白为什么因为控制器的资源定义而且它会思考"这是它的存储方法。

    2. 尝试打印外观Input::all(),但它是空的

    3. 试图制作:

      public function create(){
          $request = new \Request();
          //print $request
      }  
      

      但它不起作用,我认为这不是正确的方法。

    4. 因此,任何想法如何在控制器中获取这些值都将受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

您应该能够使用Input :: old()

获取数据

在你的观点中你可以做到

<input type="text" name="name" value="{{ old('name') }}" />

如果已发送,则会从名称中提供值。

另见最近的问题/答案; Laravel 5 - Validation error on form doesn't re-enter user input

答案 1 :(得分:0)

如果您使用{!! Form::open() !!}(或Form::model),则会再次加载所有内容(重定向后)。 Laravel自动捕获&#34;输入::旧&#34;值。

来自:FormBuilder.php(照亮/ html包 - 版本5.0)

/**
 * Get the value that should be assigned to the field.
 *
 * @param  string  $name
 * @param  string  $value
 * @return string
 */
public function getValueAttribute($name, $value = null)
{
    if (is_null($name)) return $value;

    if ( ! is_null($this->old($name)))
    {
        return $this->old($name);
    }

    if ( ! is_null($value)) return $value;

    if (isset($this->model))
    {
        return $this->getModelValueAttribute($name);
    }
}

如果您不想使用illuminate / html,只需添加您的value属性:

Input::old('input_name')

如果您想获得请求。只需添加到您的create方法即可。

public function create(Request $request){
   $data = $request->all(); //or whatever you want..
}