PHP 实现了一种代码复用的方法,称为 trait。
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。
<?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基础插件,就可以在多个项目间复用。
感谢分享~