Laravel - 扩展 Illuminate\Http\Request 并使用会话
Laravel - extending Illuminate\Http\Request and using session
我扩展了 Illuminate\Http\Request
class 并将其传递给我的控制器。
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.
我觉得这与我的自定义请求中没有 运行 中间件有关,但我不知道如何让它工作。帮助或 pionting 到正确的方向将不胜感激。
提供更多信息。我正在尝试制作一个向导。多个页面,其中一页的内容取决于前几页的选择。我将数据存储在会话中,在最后一页上我用它“填充”并清除当前用户的会话存储。
因为它有很多代码行,而且由于会话实例根据请求存在,所以我认为在自定义请求和控制器中隐藏所有这些行会很优雅,只需调用 $myRequest->storeInputs()
在我看来,在这种特殊情况下,这是“最优雅”的,所以我更愿意以这种方式完成它,但如果有更好的方法,我也愿意接受不同的解决方案。
总结:基本上我应该在哪里隐藏所有那些正在存储和从 sesison 检索数据的行?
解决方案:我实际上通过扩展 FormRequest 解决了它,因为它是最适合我尝试做的事情的解决方案。但是我接受了一个提供的答案,因为我相信它通常是更好的解决方案,如果不是这个非常特殊的情况,我会使用它。
经典的 Laravel 请求已经有了一堆您在自定义请求中没有捕捉到的设置。为此,您应该设置一个中间件(在您的 use-case 中可能是全局的),它用您的容器替换 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);
}
}
我扩展了 Illuminate\Http\Request
class 并将其传递给我的控制器。
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.
我觉得这与我的自定义请求中没有 运行 中间件有关,但我不知道如何让它工作。帮助或 pionting 到正确的方向将不胜感激。
提供更多信息。我正在尝试制作一个向导。多个页面,其中一页的内容取决于前几页的选择。我将数据存储在会话中,在最后一页上我用它“填充”并清除当前用户的会话存储。
因为它有很多代码行,而且由于会话实例根据请求存在,所以我认为在自定义请求和控制器中隐藏所有这些行会很优雅,只需调用 $myRequest->storeInputs()
在我看来,在这种特殊情况下,这是“最优雅”的,所以我更愿意以这种方式完成它,但如果有更好的方法,我也愿意接受不同的解决方案。
总结:基本上我应该在哪里隐藏所有那些正在存储和从 sesison 检索数据的行?
解决方案:我实际上通过扩展 FormRequest 解决了它,因为它是最适合我尝试做的事情的解决方案。但是我接受了一个提供的答案,因为我相信它通常是更好的解决方案,如果不是这个非常特殊的情况,我会使用它。
经典的 Laravel 请求已经有了一堆您在自定义请求中没有捕捉到的设置。为此,您应该设置一个中间件(在您的 use-case 中可能是全局的),它用您的容器替换 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);
}
}