Laravel 5.2表单验证请求不能正常工作

7
当我点击提交按钮时,什么也没有发生,页面只是刷新了一下。
这是我的代码:
app/Http/routes.php
Route::group(['middleware' => ['web']], function () {
    Route::get('profile/edit', 'UserController@editProfile');
    Route::post('update_name', 'UserController@updateName');
});

app/Http/Request/UpdateNameRequest.php

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;
use Illuminate\Support\Facades\Auth;

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

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'first_name' => 'required|min:2|alpha',
            'last_name' => 'required|min:2|alpha',
        ];
    }
}

app/Http/Controllers/UserController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Requests;
use App\User;

class UserController extends Controller
{
    public function __construct() {
        $this->middleware('auth');
    }

    public function editProfile() {
        if (Auth::user()->role_id === 3) {
            return view('profile.crew.edit');          
        }
    }

    public function updateName(Requests\UpdateNameRequest $request) {
        return dd($request->all());
    }
}

以下是HTML表单

{!! Form::open(array('url' => 'update_name')) !!}
<div class="form-group{{ $errors->has('first_name') ? ' has-error' : '' }}">
    <label class="control-label">First Name</label>
    <input type="text" class="form-control" name="first_name" value="{{ old('first_name') }}" placeholder="{{ Auth::user()->first_name }}">

    @if ($errors->has('first_name'))
        <span class="help-block">
            <strong>{{ $errors->first('first_name') }}</strong>
        </span>
    @endif
</div>
<div class="form-group{{ $errors->has('last_name') ? ' has-error' : '' }}">
    <label class="control-label">Last Name</label>
    <input type="text" class="form-control" name="last_name" value="{{ old('last_name') }}" placeholder="{{ Auth::user()->last_name }}">

    @if ($errors->has('last_name'))
        <span class="help-block">
            <strong>{{ $errors->first('last_name') }}</strong>
        </span>
    @endif
</div>
<button type="submit" class="btn btn-success">Update name</button>
{!! Form::close() !!}

以下是参考的表单输出:

<form method="POST" action="http://localhost:8000/update_name" accept-charset="UTF-8">
    <input name="_token" type="hidden" value="VViupfPaPCQCk5aeUdc27Pt2Z8J7Hx1Y2khC0IY9">
    <div class="form-group">
        <label class="control-label">First Name</label>
        <input type="text" class="form-control" name="first_name" value="" placeholder="Hans">

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

    </div>
    <button type="submit" class="btn btn-success">Update name</button>
</form>

这是我在php artisan route:list中的输出结果

+--------+----------+-------------------------+------+-----------------------------------------------------------------+--------------+
| Domain | Method   | URI                     | Name | Action                                                          | Middleware   |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+--------------+
|        | GET|HEAD | /                       |      | Closure                                                         | web          |
|        | GET|HEAD | home                    |      | App\Http\Controllers\HomeController@index                       | web,web,auth |
|        | GET|HEAD | login                   |      | App\Http\Controllers\Auth\AuthController@showLoginForm          | web,guest    |
|        | POST     | login                   |      | App\Http\Controllers\Auth\AuthController@login                  | web,guest    |
|        | GET|HEAD | logout                  |      | App\Http\Controllers\Auth\AuthController@logout                 | web          |
|        | POST     | password/email          |      | App\Http\Controllers\Auth\PasswordController@sendResetLinkEmail | web,guest    |
|        | POST     | password/reset          |      | App\Http\Controllers\Auth\PasswordController@reset              | web,guest    |
|        | GET|HEAD | password/reset/{token?} |      | App\Http\Controllers\Auth\PasswordController@showResetForm      | web,guest    |
|        | GET|HEAD | profile                 |      | App\Http\Controllers\UserController@getProfile                  | web,web,auth |
|        | GET|HEAD | profile/edit            |      | App\Http\Controllers\UserController@editProfile                 | web,web,auth |
|        | GET|HEAD | register                |      | App\Http\Controllers\Auth\AuthController@showRegistrationForm   | web,guest    |
|        | POST     | register                |      | App\Http\Controllers\Auth\AuthController@register               | web,guest    |
|        | POST     | update_email            |      | App\Http\Controllers\UserController@updateEmail                 | web,web,auth |
|        | POST     | update_name             |      | App\Http\Controllers\UserController@updateName                  | web,web,auth |
|        | POST     | update_password         |      | App\Http\Controllers\UserController@updatePassword              | web,web,auth |
|        | POST     | update_profile_picture  |      | App\Http\Controllers\UserController@updateProfilePicture        | web,web,auth |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+--------------+

你确定这个路径是正确的吗?公共函数updateName(Requests \ UpdateNameRequest $ request)我认为应该只是“UpdateNameRequest”。 - Ricardo Vigatti
是的,我确定这是正确的路径。 - emurmotol
我按照你说的方法尝试运行它,但是出现了这个错误 Class App\Http\Controllers\UpdateNameRequest does not exist - emurmotol
嗯,好的。我在代码中没发现任何错误。既然你说页面只是刷新了一下,你可以在视图中显示所有错误,以检查是否有其他因素影响了你的验证。 - Ricardo Vigatti
你能否移除 web 中间件并再次尝试。 - noobHere
7个回答

10

我想为那些使用Postman或任何此类应用程序检查验证的人添加一些内容,请确保在标题选项卡中添加如下内容:

Accept: application/json

否则你将无法获得应用程序错误,页面仅会刷新并返回200。


是的,这对我就是这样了。 - Lucas Pottersky
谢谢你的回答。 - serii

4

您的错误变量返回的是空值。这就是为什么没有显示任何错误,只是看起来页面正在刷新。您的验证是有效的,但错误值没有显示。

尝试一下: 在 app\Http\Kernel.php 文件中,将 \Illuminate\Session\Middleware\StartSession::classweb $middlewareGroups 移动到 $middleware 中。


谢谢你的建议。我已经将routes.php文件中的middlewareweb更改为auth,现在验证可以正常工作了。 - emurmotol

0

是的,我做了。当我从浏览器查看源代码时,表单看起来很好。 - emurmotol
请再检查一下,我已经添加了表单输出。 - emurmotol

0

您正在遇到令牌不匹配异常(TokenMismatchException)的问题..请确保您的会话存储路径可写


0

不确定它是什么,但这里有几个尝试的方法:

明确添加 method => post

{!! Form::open(array('url' => 'update_name', 'method' => 'post')) !!}

检查你的路由,确保路由已经正确注册。运行:
`php artisan route:list`

如果所有其他方法都失败了,尝试使用Postman手动发送POST请求。这样至少可以让您确定问题是在表单中还是在设置POST路由中。

最后,与此问题无关,我建议保持简单。在这样的路由上,没有必要使用Request类,只需使用内联验证即可。

public function updateName(Illuminate\Http\Request $request) {
    $this->validate($request, [
        'first_name' => 'required',
        'last_name' => 'required'
    ]);
    return dd($request->all());
}

我尝试在Postman上运行http:// localhost:8000 / update_name,但Laravel生成了一个带有以下错误的HTML页面:“糟糕,似乎出了些问题。TokenMismatchException”。 - emurmotol
当我运行这个程序时,仍然没有任何反应。public function updateName(Illuminate\Http\Request $request) { $this->validate($request, [ 'first_name' => 'required', 'last_name' => 'required' ]); return dd($request->all()); } - emurmotol
但是当我这样做 public function updateName(Illuminate\Http\Request $request) { return dd($request->all()); } 时,它可以正常工作。 - emurmotol
我认为问题出在我尝试使用规则进行验证时。你有什么想法如何解决这个问题吗?我已经花了几个小时来尝试让它正常工作,但是我还是做不对。我以前在我的其他项目中也做过这个,而且它可以正常工作,我只是不知道为什么现在不行了。你认为这是 Laravel 的一个 bug 吗? - emurmotol
@Marley 如果你认为这是一个验证错误,只需在你正在测试的方法开头加上dd()。在故障排除时,将问题缩小到你需要让某些东西正常工作,然后从那里开始构建。很可能这不是Laravel的一个bug。 - mrberggg
我已经将routes.php文件中的middlewareweb改为auth,现在它可以正常工作。 - emurmotol

0

我解决了这个问题,我改变了这个:

Route::group(['middleware' => ['web']], function () {
    Route::get('profile/edit', 'UserController@editProfile');
    Route::post('update_name', 'UserController@updateName');
});

到:

Route::group(['middleware' => ['auth']], function () {
    Route::get('profile/edit', 'UserController@editProfile');
    Route::post('update_name', 'UserController@updateName');
});

谢谢大家 :)


-1

如果您要验证的字段数量超过了提交表单上的字段数量,也会出现此错误。

请确保您不要验证比提交表单上的字段更多的字段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接