首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel - extending Illuminate\Http\Request和使用会话

Laravel - extending Illuminate\Http\Request和使用会话
EN

Stack Overflow用户
提问于 2020-09-19 02:50:29
回答 1查看 369关注 0票数 0

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

代码语言:javascript
复制
use Illuminate\Http\Request;

class MyRequest extends Request
{
   ...
}

控制器

代码语言:javascript
复制
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来解决它的,因为它是最适合我正在尝试做的事情的解决方案。然而,我接受了一个提供的答案,因为我相信它通常是更好的解决方案,如果不是针对这个非常特殊的情况,我会使用它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-19 03:14:53

经典的Laravel请求已经有了一堆您在自定义请求中没有捕获的设置。要实现这一点,您应该设置一个中间件(在您的用例中可能是全局的),它会用您的请求替换Laravel容器中的旧请求。

代码语言:javascript
复制
<?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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63961286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档