Request 基类
打算自定义自己的 Request 类,方便代码提示。发现无法获取到参数,于是有了这篇文章
起因
有个查询接口,依赖注入 Request:
public function index(Request $request, SpXh $model)
{
$query = $model->query();
if ($request->title) {
$query->where('title', 'like', '%' . $request->title . '%');
}
$query->orderBy($request->order ?: 'id', $request->by ?: 'desc');
$list = $query->paginate($request->pageSize ?: 10, ['*']);
SpXhResource::wrap('list');
return SpXhResource::collection($list);
}
正常运行无问题,但使用PhpStorm
时,$request->title
之类的调用,会提示Property accessed via magic method
,极度不美观。
于是打算写个扩展类,通过@property
注释,解决这个问题
PageRequest
继承下Illuminate\Http\Request
,就行了:
<?php
declare(strict_types=1);
namespace App\Http\Requests;
use Illuminate\Http\Request;
/**
* Class PageRequest
* @package App\Http\Requests
* @property string current
* @property string order
* @property string by
* @property int pageSize
*/
class PageRequest extends Request
{
}
然后修改index:
// 修改前
public function index(Request $request, SpXh $model)
// 修改后
public function index(PageRequest $request, SpXh $model)
无比美妙:
无法获取参数
看起来很不错,一运行就挂了,因为这个$request->all()
居然是空数组[]
。
由于之前写过自定义的SpxhRequest
,继承Illuminate\Foundation\Http\FormReques
是没有问题的,而Illuminate\Foundation\Http\FormReques
也是继承的Illuminate\Http\Request
,现在的情况就是:Request
-> OK,FormRequest
继承Request
-> OK,SpxhRequest
继承FormRequest
-> OK,PageRequest
继承Request
-> NOT OK!
瞬间抓掉了一把本就不多的毛发。。。
中间过程就不细说了,本人太Low
,走了好多坎坷路,写出来太丢人。
解决方案
参照FormRequest
:
BaseRequest
<?php
declare(strict_types=1);
namespace App\Http\Requests;
use Illuminate\Contracts\Container\Container;
use Illuminate\Http\Request;
/**
* Class BaseRequest
* @package App\Http\Requests
*/
class BaseRequest extends Request
{
/**
* The container instance.
*
* @var \Illuminate\Contracts\Container\Container
*/
protected $container;
/**
* Set the container implementation.
*
* @param Container $container
* @return $this
*/
public function setContainer(Container $container)
{
$this->container = $container;
return $this;
}
/**
* Create a new request instance from the given Laravel request.
*
* @param Request $from
* @param Request|null $to
*
* @return static
*/
public static function createFrom($from, $to = null)
{
$request = $to ?: new static();
$files = $from->files->all();
$files = is_array($files) ? array_filter($files) : $files;
$request->initialize(
$from->query->all(),
$from->request->all(),
$from->attributes->all(),
$from->cookies->all(),
$files,
$from->server->all(),
$from->getContent()
);
$request->headers->replace($from->headers->all());
$request->setJson($from->json());
if ($session = $from->getSession()) {
$request->setLaravelSession($session);
}
$request->setUserResolver($from->getUserResolver());
$request->setRouteResolver($from->getRouteResolver());
return $request;
}
}
BaseRequestServiceProvider
<?php
declare(strict_types=1);
namespace App\Providers;
use App\Http\Requests\PageRequest;
use Illuminate\Support\ServiceProvider;
class BaseRequestServiceProvider extends ServiceProvider
{
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
$this->app->resolving(PageRequest::class, function ($request, $app) {
$request = BaseRequest::createFrom($app['request'], $request);
$request->setContainer($app);
});
}
}
config -> app.php
增加
[
'providers' => [
App\Providers\BaseRequestServiceProvider::class,
]
]
推荐文章: