关于 Laravel 请求的问题

后台使用了Laravel-admin,然后在控制器中注入了一个新增的request类(CRequest),
然后添加表单的时候,如果符合了条件则会添加成功。
但是如果不符合条件会报出 Trying to get property 'headers' of non-object。
追踪了一下发现是csrf那个中间件报出来的错误。

protected function addCookieToResponse($request, $response)
    {
        $config = config('session');

        $response->headers->setCookie(
            new Cookie(
                'XSRF-TOKEN', $request->session()->token(), $this->availableAt(60 * $config['lifetime']),
                $config['path'], $config['domain'], $config['secure'], false, false, $config['same_site'] ?? null
            )
        );

        return $response;
    }

这里获取了$response的headers,我打印出了$response,是一个数组,就是reqeust类里面的报错信息数组。

之前一开始我的代码也是正确的,然后我找同事的代码来看(他是clone我旧的代码),他能正确执行代码,打印了一下这个$response 这个应该报出一个jsonResponse的对象才是正确的。
往上追handle方法:

public function handle($request, Closure $next)
    {
        if (
            $this->isReading($request) ||
            $this->runningUnitTests() ||
            $this->inExceptArray($request) ||
            $this->tokensMatch($request)
        ) {
            return tap($next($request), function ($response) use ($request) {
                if ($this->shouldAddXsrfTokenCookie()) {
                    $this->addCookieToResponse($request, $response);
                }
            });
        }

        throw new TokenMismatchException('CSRF token mismatch.');
    }

这里$next($request)出来的就是后面的$response。
后面可能不知道改了什么东西就变成了这样,有大神了解吗?谢谢了!

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

你用响应来返回错误应该就可以了,不要直接返回数组。。。

以下纯猜测:
如果你之前也是直接返回数组,没报错,可能你的请求是 ajax 请求,会自动转成 JsonResponse 吧,,,

4年前 评论

找到了原因:
之前覆盖了exception handle 的一个方法convertValidationExceptionToResponse 用来输出给api那边用,然后没留意影响到了web这边的异常处理,导致异常是一个数组,现在我分开来弄,解决了。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!