扩展请求类的最佳实践

efnic

如何扩展请求对象而不影响webman升级?

PHP 实现了一种代码复用的方法,称为 trait。

Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。

定义你自己的 trait

<?php

namespace plugin\customs\api;

use plugin\customs\app\model\PushApplication;
use plugin\customs\app\proxy\Authorization;
use support\Request;

/**
 * 附加数据:中国海关应用
 */
trait HasPushApplication
{
    /**
     * 验证数据:中国电子口岸代理组件的请求信息
     * @var Authorization|null
     */
    private ?Authorization $authorization = null;
    /**
     * 应用数据
     * @var PushApplication|null
     */
    private ?PushApplication $pushApplication = null;

    /**
     * 获取验证数据
     * @return Authorization|null
     */
    public function getAuthorization(): ?Authorization
    {
        return $this->authorization;
    }

    /**
     * 设置验证数据
     * @param Authorization $authorization
     * @return HasPushApplication|Request
     */
    public function setAuthorization(Authorization $authorization): self
    {
        $this->authorization = $authorization;
        return $this;
    }

    /**
     * 获取应用数据
     * @return PushApplication|null
     */
    public function getPushApplication(): ?PushApplication
    {
        return $this->pushApplication;
    }

    /**
     * 设置应用数据
     * @param PushApplication $pushApplication
     * @return HasPushApplication|Request
     */
    public function setPushApplication(PushApplication $pushApplication): self
    {
        $this->pushApplication = $pushApplication;
        return $this;
    }
}

在请求类中使用

<?php

namespace support;

use Ledc\Webman\Traits\HasRequest;
use plugin\customs\api\HasPushApplication;

/**
 * 请求类
 */
class Request extends \Webman\Http\Request
{
    use HasRequest, HasPushApplication;

    /**
     * 是否是https请求
     * @return bool
     */
    public function isHttps(): bool
    {
        $protocol = $this->header('x-forwarded-proto');
        $value = match ($protocol) {
            'https' => true,
            'http' => false,
            default => null
        };
        if ($value !== null) {
            return $value;
        }
        return false;
    }
}

在中间件中使用

// 注入附加数据
$request->setAuthorization($auth)->setPushApplication($pushApplication);

结语

这样操作之后,既不影响webman升级,也不会被覆盖。

您也可以把 trait 特征,连同您的其他公共逻辑,封装成webman应用插件wenbman基础插件,就可以在多个项目间复用。

185 1 4
1个评论

不知名选手

感谢分享~

  • 暂无评论

efnic

4274
积分
0
获赞数
0
粉丝数
2019-08-27 加入
🔝