Laravel 5.2 - Auth:显示自定义错误消息

9
如何在不触及基础文件的情况下自定义错误消息(例如“这些凭据与我们的记录不符。”)在登录/注册失败时显示?我正在寻找解决方案,希望是一个优雅的解决方案,至少不要触及AuthenticatesAndRegistersUsers或ThrottlesLogins :)
我在执行以下命令后,使用Laravel提供的AuthController和表单: php artisan make:auth
控制器: (它只有一个构造函数和两个方法,其余的都在基础上,方法是:)
protected function validator(array $data)
{
    return Validator::make($data, [
        'name' => 'required|max:255',
        'email' => 'required|email|max:255|unique:users',
        'password' => 'required|confirmed|min:6',
    ]);
}
protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
    ]);
}

表单:

<form class="form-horizontal" role="form" method="POST" action="{{ url('/login') }}">
{!! csrf_field() !!}

<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
    <label class="col-md-4 control-label">E-Mail</label>

    <div class="col-md-6">
        <input type="email" class="form-control" name="email" value="{{ old('email') }}" required>

        @if ($errors->has('email'))
            <span class="help-block">
                <strong>{{ $errors->first('email') }}</strong>
            </span>
        @endif
    </div>
</div>

<div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
    <label class="col-md-4 control-label">Password</label>

    <div class="col-md-6">
        <input type="password" class="form-control" name="password" required>

        @if ($errors->has('password'))
            <span class="help-block">
                <strong>{{ $errors->first('password') }}</strong>
            </span>
        @endif
    </div>
</div>

<div class="form-group">
    <div class="col-md-6 col-md-offset-4">
        <div class="checkbox">
            <label>
                <input type="checkbox" name="remember"> Remember Me
            </label>
        </div>
    </div>
</div>

<div class="form-group">
    <div class="col-md-6 col-md-offset-4">
        <button type="submit" class="btn btn-primary">
            <i class="fa fa-btn fa-sign-in"></i>Login
        </button>

        <a class="btn btn-link" href="{{ url('/password/reset') }}">Forgot Your Password?</a>
    </div>
</div>

谢谢!

2个回答

16

你可以在来自 AuthenticatesUsers trait 的 AuthController 上覆盖 getFailedLoginMessage

protected function getFailedLoginMessage()
{
    return 'what you want here.';
}

或者不覆盖它,为auth.failed设置一个语言值。 getFailedLoginMessage方法将检查Lang :: has('auth.failed')是否可用,并在可用时使用它。

对于实际的验证错误消息,您可以重写postLogin并将自己的消息数组传递给validate,或者如果您想全局更改它们,则可以在resources/lang/{lang}/validation.php中的适当语言文件中进行调整。


谢谢 @lagbox 的回答!那么对于用户注册表单上的其他每个错误消息,比如“名称字段是必需的”或“密码确认不匹配”,该怎么办? - Juan Serrats
2
这些是验证消息,您可以调整AuthController以将自己的消息数组传递到验证调用中,或者在语言文件中全局更新它们。 - lagbox

8

您不希望在AuthController中覆盖getFailedLoginMessage()方法。正确的解决方案是在指定位置更改消息。如果您查看Resources > lang > en文件夹,您会看到一个auth.php文件。其中有一个“failed”属性,您可以自定义消息。在那里进行更改。Laravel认证文件中的原始getFailedLoginMessage()方法首先查找该位置以获取自定义消息,然后才使用默认消息。


谢谢 Joshua!! :) - Juan Serrats
如果您更新了lang文件中的auth消息响应,则其他Auth响应的消息回复也会被更新。更好的解决方案是覆盖函数并执行您想要的操作。如果您有多个认证系统,则使用AuthenticatesUsers trait的其他模型也将获得与您的更新相同的响应,因为您的更新将全局影响它们。 - Mohit Satish Pawar

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