不能使用Angular POST数据到Laravel 5控制器,Error: 422 Unprocessable Ent


Can't POST data to Laravel 5 controller using Angular, Error : 422 Unprocessable Entity

我有一个使用angularjs的登录表单。我想将输入的凭据发送到Laravel 5中的默认AuthController。我的问题是服务器返回422不可处理的实体并在响应中说: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控制器的问题?

如果你想让他们用用户名而不是电子邮件登录,它应该像在你的AuthController类上设置username属性一样简单

class AuthController extends Controller {
    protected $username = 'username';
}

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

如果你想让他们有选择登录用户名电子邮件,那么这是另一个故事。我为此写了一篇博文

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

422(不可处理实体)状态码表示服务器理解请求实体的内容类型(因此是415(不支持的媒体类型)状态码不合适),以及请求实体的语法是正确的(因此是400(错误请求))状态码不合适),但无法处理包含的指令。例如,如果XML请求体包含格式良好的(即语法正确的),但是语义错误,XML指令。

在Laravel文档中,它说默认情况下,email字段被用作"username":

缺省情况下,auth。基本中间件将使用电子邮件列用户记录为"username"。

我建议你编辑授权。为了使用"username"作为主用户名,中间件配置中的基本参数

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

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