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