我已经设置了一个Ionic应用程序,将Laravel 5.1用作API。当我尝试使用Laravel的样板AuthController登录,注册或通过电子邮件发送重置密码链接时,会收到通过AngularJS ngResource发送到关联RESTful端点的请求,但它总是会在返回200之前执行302 URL重定向来加载视图来自不同发起人的响应,其中包含与未找到视图相关的错误,我可以在Chrome的网络标签中看到该错误(请参阅下面的输出)。我希望找不到该视图,因为我使用Laravel作为API并且除了电子邮件模板之外没有其他视图。我想要做的就是删除重定向。
例如,忘记密码电子邮件请求将会消失(并且使用电子邮件模板通过重置链接接收电子邮件),而不是针对该请求的JSON响应,发生URL重定向(代码302),然后是响应200错误,找不到视图:
**错误回复**
Sorry, the page you are looking for could not be found.
NotFoundHttpException in RouteCollection.php).
Chrome控制台 - 网络标签
Name Status Type Initiator Size Time
forgot 302 text/html ionic.bundle.js:18526 614 B 2.38 s
localhost 200 xhr http://project.dev/api/password/forgot 2.3 KB 2.00 ms
我期望的是:
Name Status Type Initiator Size Time
forgot 200 text/html ionic.bundle.js:18526 614 B 2.38 s
如果我使用不使用AuthController操作的路由,而只是返回如下的JSON响应,则会发生这种情况:
Route::post('email', function () {
return response()->json([ 'message' => 'Send an email!' ], 200);
});
Laravel Routes
+--------+----------+------------------------------+----------------------+-------------------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+------------------------------+----------------------+-------------------------------------------------------------+------------+
| | GET|HEAD | test | | Closure | |
| | POST | api/auth/login | | Project\Http\Controllers\Auth\AuthController@postLogin | guest |
| | GET|HEAD | api/auth/logout | | Project\Http\Controllers\Auth\AuthController@getLogout | |
| | POST | api/auth/register | | Project\Http\Controllers\Auth\AuthController@postRegister | guest |
| | POST | api/password/forgot | | Project\Http\Controllers\Auth\PasswordController@postEmail | guest |
| | POST | api/password/reset | | Project\Http\Controllers\Auth\PasswordController@postReset | guest |
+--------+----------+------------------------------+----------------------+-------------------------------------------------------------+------------+
所以我查看了不同的Auth相关类和特性,并通过一些帮助发现我可以通过将它们添加到AuthController来覆盖postLogin,postRegister,postEmail,postReset和getLogout路由。例如,postEmail现在返回一个响应并位于AuthController中:
** AuthController中的postEmail覆盖** 这是原始postEmail方法的副本,返回语句中有更改。
public function postEmail(Request $request)
{
$this->validate($request, [ 'email' => 'required|email' ]);
$response = Password::sendResetLink($request->only('email'), function (Message $message) {
$message->subject($this->getEmailSubject());
});
switch ($response) {
case Password::RESET_LINK_SENT:
return response()->json([ 'message' => trans($response) ], 200);
case Password::INVALID_USER:
return response()->json([ 'message' => trans($response) ], 400);
}
}
但是,在AuthController中覆盖了这个和其他(postLogin,postRegister,postReset和getLogout),并且重定向被JSON响应覆盖,由于某种原因,仍然会发生302 URL重定向,就好像我对AuthController所做的更改不是& #39; t被应用。为什么这还没有工作?
答案 0 :(得分:2)
你可以返回一个json响应。
public function register()
{
// do what ever to register the user
// then just return a json response
return response()->json([
'message' => 'user was registered'
]);
}
编辑:
将此方法添加到Http \ Requests \ Request:
public function response(array $errors)
{
return new JsonResponse($errors, 422);
}
我认为Laravel 5.1中可能存在一个错误,它将每个请求作为常规请求处理而不是ajax请求。该方法应该解决它,它确实适合我。
答案 1 :(得分:2)
您可以覆盖redirectPath
特征的Illuminate\Foundation\Auth\RedirectsUsers
方法。
public function redirectPath()
{
return response()->json([
'msg' => 'your custom message'
]);
}
答案 2 :(得分:2)
发生这种情况的原因是:
现在我没有302网址重定向发生了,而且我有点明智......? :)
答案 3 :(得分:0)
我想我遇到了这个问题。
请注意,app / Http / Kernel.php中加载了一个中间件,它命名为RedirectIfAuthenticated。它包含有关重定向到家庭控制器的逻辑。只需评论它,它就会完成。