2

我已经设置了一个 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 路线

+--------+----------+------------------------------+----------------------+-------------------------------------------------------------+------------+
| 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 所做的更改没有被应用。为什么这仍然不起作用?

4

4 回答 4

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 请求处理。该方法应该可以解决它,它对我有用。

于 2015-06-22T01:29:52.590 回答
2

您可以覆盖特征的redirectPath方法Illuminate\Foundation\Auth\RedirectsUsers

public function redirectPath()
{
    return response()->json([
        'msg' => 'your custom message'
    ]);
}
于 2015-06-22T01:36:43.940 回答
2

出现这种情况的原因是:

  1. postEmail 和 postReset 函数不属于我不小心将它们粘贴在 postLogin 和 postRegister 旁边的 AuthController 中,它们属于 PasswordController (yeesh)
  2. 在将原始方法的副本放入控制器以覆盖和更改重定向到 JSON 响应后,两个控制器都缺少一些依赖项
  3. 此外,必须删除来自 AuthController 中的构造函数的来宾中间件,以防止在身份验证时重定向到 /home

现在我不再发生 302 URL 重定向,而且我更聪明了...?:)

于 2015-06-24T08:42:37.140 回答
0

我想我遇到了这个问题。

请注意,在 app/Http/Kernel.php 中加载了一个名为 RedirectIfAuthenticated 的中间件。它包含有关重定向到家庭控制器的逻辑。只需评论它,它就会完成。

于 2015-08-27T13:26:18.190 回答