【问题标题】:Laravel 5.1.4 validation fail not populating old data when using RESTful routes使用 RESTful 路由时,Laravel 5.1.4 验证无法填充旧数据
【发布时间】:2015-11-13 10:31:50
【问题描述】:

我正在尝试构建一个后端管理区域以将用户添加到我的应用程序(我不希望用户注册我希望他们由管理员设置)。

我已经创建了必要的控制器和请求。

如果数据是可接受的,它将通过 POST 请求提交给 domain.tld/admin/users 并通过 UserController@store 存储。

当不满足验证条件时,用户将被发送回表单 (domain.tld/admin/users/create) 并显示错误消息,但不会使用先前填写的数据填充字段.

我使用Route::resource('admin/users') 来创建 RESTful 路由和一个干净的路由文件,我发现当 HTTP POST 请求由@987654323 生成的父路由(domain.tld/admin/users)发出时@,FormRequest 不会填充旧数据。

但是当对表单所在的创建路由(domain.tld/admin/users/create)发出 HTTP POST 请求时,验证失败会正确填充旧数据。

有没有什么方法可以让这项工作在我看来仍然使用Route::resource('admin/users') 而不必使用{{ old('') }} 助手?

UsersController(非常基础)

<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\User;
use App\Http\Requests\Admin\UserCreateRequest;

class UsersController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {
        $users = User::all();
        return view('admin.users.index', compact('users'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return Response
     */
    public function create()
    {
        $users = User::all();
        return view('admin.users.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(UserCreateRequest $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  Request  $request
     * @param  int  $id
     * @return Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function destroy($id)
    {
        //
    }
}

用户创建请求

<?php

namespace App\Http\Requests\Admin;

use App\Http\Requests\Request;

class UserCreateRequest extends Request
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'first_name' => 'required|max:255',
            'last_name' => 'required|max:255',
            'email' => 'required|confirmed|email|max:255|unique:users',
            'password' => 'required|confirmed|min:6',
        ];
    }
}

create.blade.php

@extends('admin._layouts.master')

@section('title', 'Create a user')

@section('content')

    <form method="post" action="{{ action('Admin\UsersController@store') }}">

        @foreach ($errors->all() as $error)
            <p class="alert alert-danger">{{ $error }}</p>
        @endforeach

        @if (session('status'))
            <div class="alert alert-success">
                {{ session('status') }}
            </div>
        @endif

        {!! csrf_field() !!}

        <div class="form-group">
            <label for="first_name">First Name</label>
            <input class="form-control" id="first_name" placeholder="First Name" type="text" name="first_name">
        </div>

        <div class="form-group">
            <label for="last_name">Last Name</label>
            <input class="form-control" id="last_name" placeholder="Last Name" type="text" name="last_name">
        </div>

        <div class="form-group">
            <label for="email">Email address</label>
            <input class="form-control" id="email" placeholder="Email" type="email" name="email">
        </div>

        <div class="form-group">
            <label for="email_confirmation">Confirm email address</label>
            <input class="form-control" id="email_confirmation" placeholder="Email" type="email" name="email_confirmation">
        </div>

        <div class="form-group">
            <label for="password">Password</label>
            <input class="form-control" id="password" placeholder="Password" type="password" name="password">
        </div>

        <div class="form-group">
            <label for="password_confirmation">Confirm Password</label>
            <input class="form-control" id="password_confirmation" placeholder="Password" type="password" name="password_confirmation">
        </div>

        <button class="btn btn-default" type="submit">Submit</button>
    </form>

@endsection

任何帮助将不胜感激。

【问题讨论】:

  • 您使用什么来创建表单?请让我们看看那个代码吗?
  • 视图中的代码是什么?请张贴输入之一。
  • 请在输入的值属性中调用 old(),你必须这样做。
  • 不再需要了,来自文档......“Laravel 允许您在下一个请求期间保留来自一个请求的输入。此功能对于在检测到验证错误后重新填充表单特别有用。但是,如果你使用 Laravel 包含的验证服务,则不太可能需要手动使用这些方法,因为 Laravel 的一些内置验证工具会自动调用它们。”我已经看到了这项工作,但在使用 RESTful 路由时没有,仅在向自身提交 POST 请求而不是父路由时。
  • 查看 FormRequest 中的第 135 行,它所做的正是我们在 Laravel 4 中必须手动执行的操作,使用旧输入和错误进行重定向。接下来我们需要在 Laravel 4 中做什么?我们自己闪出旧的输入。所以在我看来,5.1 文档并不清楚:使用表单请求可以自动完成的实际上都是关于验证和将旧输入存储到会话中。仅此而已。

标签: php validation laravel laravel-5.1


【解决方案1】:

你想使用 Input 类在 Laravel 中获取旧的帖子数据。

<input type="text" class="form-control" value="{{Input::old('name')}}" name="name" placeholder="Enter name" required="required" />

【讨论】:

  • OP 提到他们已经知道 old() 助手,这实际上是一回事。
  • 我希望验证请求按照应有的方式自动填充旧数据(当表单提交给自身而不是其父级时)。如果不需要,我不想在视图中添加助手。
  • 这仅在不使用 Laravel 内置方法时才正确。
猜你喜欢
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 2018-01-18
  • 2019-03-13
  • 2013-05-22
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
相关资源
最近更新 更多