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 基类

无法获取参数

看起来很不错,一运行就挂了,因为这个$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,
    ]
]

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
秦晓武
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~