无法使用Angular,错误:422 Unprocessable Entity将数据发送到Laravel 5控制器

时间:2015-10-15 14:09:34

标签: javascript php angularjs laravel laravel-5

我有一个使用angularjs的登录表单。我想将输入的凭据发送到 Laravel 5 中的默认AuthController。我遇到的问题是服务器返回 422 Unprocessable Entity 并在回复中说:email field is required

HTML:

<form class="login-form" ng-controller="LoginController" name="loginForm" novalidate>
    <input type="hidden" name="_token" ng-model="_token" value="<?php echo csrf_token(); ?>">
    <h3 class="form-title">
Login
    </h3>
    <div ng-show="msg" class="alert alert-danger ng-cloak">
        <button class="close" data-close="alert"></button>
        <span ng-repeat="m in msgs">
        @{{m}}
        </span>
    </div>
    <div class="form-group" ng-class="{'has-error' : loginForm.$submitted && loginForm.username.$error.required}">
        <!--ie8, ie9 does not support html5 placeholder, so we just show field title for that-->
        <label class="control-label visible-ie8 visible-ie9">
Username
        </label>
        <input ng-required="true" class="form-control form-control-solid placeholder-no-fix ltr" type="text" autocomplete="off" ng-model="username" name="username"/>
    <span ng-show="loginForm.$submitted && loginForm.username.$error.required" class="help-block help-block-error ng-cloak">
Error Text
    </span>
    </div>
    <div class="form-group"  ng-class="{'has-error' : loginForm.$submitted && loginForm.password.$error.required}">
        <label class="control-label visible-ie8 visible-ie9">
            Password
        </label>
        <a href="javascript:;" id="forget-password" class="forget-password">
            Text
        </a>

        <input ng-required="true" class="form-control form-control-solid placeholder-no-fix ltr" type="password" autocomplete="off" ng-model="password" name="password"/>
    <span ng-show="loginForm.$submitted && loginForm.password.$error.required" class="help-block help-block-error ng-cloak">
            Text
    </span>
    </div>
    <div class="form-actions">
        <button  ng-click="login(loginForm.$valid,'.login-btn')" type="submit" data-loading-text="waiting" class="btn btn-success uppercase login-btn">ورود</button>
        <label class="rememberme check pull-right">
            <input type="checkbox" name="remember" ng-model="remember" value="1"/>
remember me
        </label>
    </div>

</form>

JS控制器:

this.msgs = '';
$scope.login = function (isValid, btn) {
    if(isValid) {
        $(btn).button('loading');

        $scope.msgs = '';

        data = {
            username : $scope.username,
            password : $scope.password,
            _token : $scope._token
        };

        if($scope.remember)
            data.remember = $scope.remember;

        $http.post('/auth/login', data)
            .success(function (data, status, headers, config) {
                $(btn).button('reset');
                $scope.msgs = '';
            })
            .error(function (data, status, headers, config) {
                $(btn).button('reset');
                // Handle login errors here
                $scope.msgs = data;
            });
    }
};

如何使用用户名作为标识修复默认laravel控制器的问题?

3 个答案:

答案 0 :(得分:1)

如果您希望他们使用用户名而不是电子邮件进行登录,则应该像在username

上设置AuthController属性一样简单
class AuthController extends Controller {
    protected $username = 'username';
}

原因是AuthController使用AuthenticatesUsers特征,它检查是否设置了$username属性,如果没有,则默认为'email'

如果您希望他们可以选择使用用户名电子邮件登录,那么这是另一个故事。 I wrote a blog post about it

答案 1 :(得分:0)

根据文档,422错误消息是语义错误。

  

422(不可处理实体)状态代码表示服务器   了解请求实体的内容类型(因此a   415(不支持的媒体类型)状态代码不合适),和   请求实体的语法是正确的(因此是400(错误请求)   状态代码不合适但是无法处理包含的内容   说明。例如,如果是XML,则可能会出现此错误情况   请求正文包含格式正确(即语法正确),但是   语义错误的XML指令。

在Laravel文档中,默认情况下,电子邮件字段用作“用户名”:

  

默认情况下,auth.basic中间件将使用上面的电子邮件列   用户记录为“用户名”。

我建议您编辑中间件配置中的auth.basic参数,以便使用“username”作为主用户名。

答案 2 :(得分:-1)

因为您只传递用户名密码(并记住)字段。 您可能需要在数据对象中使用电子邮件密钥!

var data = { email: 'superman@gmail.com', username: 'SuperMan', password: 'ASDASD', rememberMe: true};