php - Laravel 5.1 - 尝试使用 Auth Boilerplate 作为 API 来防止 302 URL 重定向

标签 php laravel laravel-5 laravel-5.1

我已经设置了一个 Ionic 应用程序来使用 Laravel 5.1 作为 API。当我尝试使用 Laravel 的样板 AuthController 登录、注册或通过电子邮件发送重置密码链接时,会收到通过 AngularJS ngResource 发送到关联 RESTful 端点的请求,但它总是在返回 200 之前执行 302 URL 重定向来加载 View 来自不同发起者的响应,其中包含与未找到 View 相关的错误,我可以在 Chrome 的网络选项卡中看到该错误(请参阅下面的输出)。我预计不会找到该 View ,因为我使用 Laravel 作为 API,并且除了电子邮件模板之外没有任何 View 。我想做的是删除重定向。

例如,忘记密码的电子邮件请求将发出(并且使用电子邮件模板通过重置链接接收电子邮件),并且不会对该请求提供 JSON 响应,而是发生 URL 重定向(代码 302),然后返回响应200 错误,未找到 View :

** 错误响应 **

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 路线

+--------+----------+------------------------------+----------------------+-------------------------------------------------------------+------------+
| 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 相关类和特征,并在一些帮助下发现我可以通过将 postLogin、postRegister、postEmail、postReset 和 getLogout 路由添加到 AuthController 来覆盖它们。例如,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);
    }
}

但是,由于此内容和其他内容(postLogin、postRegister、postReset 和 getLogout)在 AuthController 中被覆盖,并且重定向被 JSON 响应覆盖,由于某种原因,302 URL 重定向仍然会发生,就好像我对 AuthController 所做的更改没有发生一样没有被应用。为什么这仍然不起作用?

最佳答案

您可以重写 Illuminate\Foundation\Auth\RedirectsUsers 特征的 redirectPath 方法。

public function redirectPath()
{
    return response()->json([
        'msg' => 'your custom message'
    ]);
}

关于php - Laravel 5.1 - 尝试使用 Auth Boilerplate 作为 API 来防止 302 URL 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30970887/

相关文章:

javascript - javascript函数中的数据切换

php - Laravel 5 imagepng 不工作

php - 按电子邮件分组并获取组中最早创建的日期 - Laravel Eloquent

php - 在某些 Controller 上运行某些代码的最佳方式 - Laravel 5

php - 将数组值插入数据库 laravel

php - 删除php mysql中的前导零

php - Mysql on select update records selected

php - 如何在 php 中读取 FormData 对象

mysql - 即使没有该月的记录,如何从查询中获取所有月份?

php - 如何在Eloquent查询中根据相关模型数据添加条件?