0

我已经扩展了这个Illuminate\Http\Request类并将它传递给我的控制器。

use Illuminate\Http\Request;

class MyRequest extends Request
{
   ...
}

控制器

class MyController
{
    // Doesnt work
    public function something(MyRequest $request) {
        var_dump($request->session())
    }

   // Does work
    public function something(Illuminate\Http\Request $request) {
        var_dump($request->session())
    }

}

所以当我试图获得会话时,$request->session()我得到RuntimeException - Session store not set on request.

我觉得这与我的自定义请求没有运行中间件有关,但我不知道如何使它工作。非常感谢帮助或指出正确的方向。

提供更多信息。我正在尝试制作一个向导。几页,其中一页的内容取决于前一页的选择。我将数据存储在会话中,在最后一页我用它“填充”并清除当前用户的会话存储。

因为它有很多代码行,并且由于会话实例根据请求而存在,所以尽管在自定义请求中隐藏所有这些行并在控制器中简单地调用它会很优雅$myRequest->storeInputs()

在这种特殊情况下,这在我看来是“最优雅的”,所以我更愿意以这种方式完成它,但如果有更好的方法,我也愿意接受不同的解决方案。

摘要:基本上我应该在哪里隐藏所有那些从 sesison 存储和检索数据的行?

解决方案:我实际上是通过扩展 FormRequest 解决了它,因为它是最适合我尝试做的事情的解决方案。但是,我接受了提供的答案,因为我相信它通常是更好的解决方案,如果不是针对这种非常特殊的情况,我会使用它。

4

1 回答 1

1

经典的 Laravel 请求已经有了一堆你在自定义请求中没有发现的设置。为此,您应该设置一个中间件(在您的用例中可能是全局的),用您的替换 Laravel 容器中的旧请求。

<?php

namespace App\Http\Middleware;

use App\Http\MyRequest;
use Closure;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Http\Request;

class CustomizeRequest
{
    /**
     * @var \Illuminate\Contracts\Foundation\Application
     */
    protected $app;

    /**
     * @var \App\Http\MyRequest
     */
    protected $myRequest;

    /**
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @param  \App\Http\MyRequest  $myRequest
     */
    public function __construct(Application $app, MyRequest $myRequest)
    {
        $this->app = $app;
        $this->myRequest = $myRequest;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $this->app->instance(
            'request', Request::createFrom($request, $this->myRequest)
        );

        return $next($this->myRequest);
    }
}
于 2020-09-18T19:14:52.547 回答