trano/tranoutilsbundle

Trano Utils Bundle

1.0.20 2024-06-11 22:14 UTC

README

TranoUtilsBundle 包含以下目的的实用工具

  • 使用 .env 文件变量配置的扩展响应,带有可配置的头部
  • 带有可配置 CORS 头的 JSON 响应设置器,使用 .env 文件变量
  • 简单的 http 查询服务语法
  • 环境变量读取器

安装

使用 composer 进行安装

composer require trano/tranoutilsbundle

使用可配置头部的扩展响应

可以使用以下指令设置响应头部

use Trano\UtilsBundle\Util\ExtendedResponse;

$extendedreponse = new ExtendedResponse();
$response = new Response('test');
$responseWithHeaders = $extendedreponse->encapsulateHeaders($response);

可以使用以下环境变量设置头部值

HEADER_STRICT_TRANSPORT_SECURITY=""
HEADER_CACHE_CONTROL=""
HEADER_PRAGMA=""
HEADER_REFERRER_POLICY=""
HEADER_X_CONTENT_TYPE_OPTIONS=""
HEADER_CONTENT_SECURITY_POLICY=""
HEADER_X_FRAME_OPTIONS=""
HEADER_X_XXS_PROTECTION=""

默认情况下,当相应的环境变量未设置时,以下安全头部值(https://owasp.org/)将被发送回客户端

Strict-Transport-Security: max-age=31536000
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Referrer-Policy: no-referrer
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'self'
X-Frame-Options: deny
X-XXS-Protection: 1; mode=block

环境变量与安全头部之间的映射

带有可配置 CORS 头和安全头部的 JsonResponse

带有默认安全头部的 JsonResponse

使用以下代码返回一个带有默认安全头部的 JsonResponse,代码 200

use Trano\UtilsBundle\Util\ApiJsonResponse;

$apijsonreponse = new ApiJsonResponse();
return $apijsonreponse->_200Ok('this is an ok results');

上述指令的结果是(注意添加了 statusmessageresults 键)

{
  "status": 200,
  "message": "",
  "results": "this is an ok results"
}

默认情况下,以下安全头部值(https://owasp.org/)将被发送回客户端

Strict-Transport-Security: max-age=31536000
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Referrer-Policy: no-referrer
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'self'
X-Frame-Options: deny
X-XXS-Protection: 1; mode=block

上述头部可以使用以下环境变量更新

HEADER_STRICT_TRANSPORT_SECURITY=""
HEADER_CACHE_CONTROL=""
HEADER_PRAGMA=""
HEADER_REFERRER_POLICY=""
HEADER_X_CONTENT_TYPE_OPTIONS=""
HEADER_CONTENT_SECURITY_POLICY=""
HEADER_X_FRAME_OPTIONS=""
HEADER_X_XXS_PROTECTION=""

要更新 CORS 头(Access-Control.*),请使用以下环境变量。

ALLOWED_ORIGIN="*"
ALLOWED_METHODS="GET,POST"
ALLOWED_HEADERS="Authorization, Content-Type"

环境变量与头部之间的映射

自定义 JsonResponse

默认情况下,ApiJsonResponse 返回一个包含 statusmessageresults 键的 JSON。要使用自定义 JSON 数据结构更改此行为,设置

JSON_RESPONSE_TYPE=custom

因此,以下 PHP 代码

use Trano\UtilsBundle\Util\ApiJsonResponse;

$apijsonreponse = new ApiJsonResponse();
return $apijsonreponse->_200Ok(["data" => 'this is an ok custom results']);

返回

{
  "data": "this is an ok custom results"
}

简单 Http 请求的使用

$httprequest 服务是 Trano\UtilsBundle\Util\HttpRequest 的一个实例

使用基本认证的 GET 查询

要使用 GET 返回关联数组响应,请使用以下指令。get 指令应在末尾。

    $http_array_response = $this->httprequest
            ->addHeader('Accept', '*/*')
            ->addHeader('Content-Type', 'application/json')
            ->setBasicAuth('username', 'password')
            ->get('https://www.example.com/getservice');

使用数组数据和基本认证的 POST 查询

要使用 POST 返回关联数组响应,请使用以下指令。

默认情况下,$data 变量使用 application/x-www-form-urlencoded 类型发送。如果 https://www.example.com/postservice 是一个 Symfony 控制器路由,则可以使用 $request->request->get('data1'); 指令获取 $data['data1'] 变量。

post 指令应在末尾。 ``

    $data = [
        'data1' => 'data1',
        'data2' => 'data2',
    ];
    $http_array_response = $this->httprequest
        ->setBasicAuth('username', 'password')
        ->setBodyArray($data)
        ->post('https://www.example.com/postservice');

请注意,由于 Symfony 请求的功能,GET 和 POST 简单查询都是同步的(这些查询会等待响应)。

环境变量读取器的使用

假设我们有一个以下的环境变量文件 .env

DATABASE_URL='mysql://aaa:bbb...'

要读取此环境变量,请使用 $env 服务,它是 Trano\UtilsBundle\Util\Env 的一个实例,如下所示

$database_url = $this->env->getEnv('DATABASE_URL');

使用 Symfony 控制器的示例

假设 .env 文件中的环境变量

ALLOWED_ORIGIN="*"
ALLOWED_METHODS="GET,POST,PUT,DELETE"
ALLOWED_HEADERS="Authorization, Content-Type"

重要:如果 .env 文件中没有设置 ALLOWED_*,则不会设置相应的 Access-Control-Allow-* 头部。

要在控制器中使用环境读取器(Trano\UtilsBundle\Util\Env)和 JSON 响应(Trano\UtilsBundle\Util\ApiJsonResponse),请使用以下脚本

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Trano\UtilsBundle\Util\ApiJsonResponse;
use Trano\UtilsBundle\Util\Env;

class HomeController extends AbstractController
{
    /**
     * @var ApiJsonResponse
     */
    private $apijsonresponse;


    /**
     * @var Env
     */
    private $env;

    /**
     * ControllerTrait constructor.
     * @param ApiJsonResponse $apijsonresponse
     * @param Env $env
     */
    public function __construct(ApiJsonResponse $apijsonresponse, Env $env)
    {
        $this->apijsonresponse = $apijsonresponse;
        $this->env = $env;
    }

    /**
     * @Route("/", methods={"GET"})
     */
    public function index(Request $request)
    {
        // Computes DATABASE_URL from .env file
        // If DATABASE_URL does not exists in .env file, it returns '' string.
        $database_url = $this->env->getEnv('DATABASE_URL');
    
        // Return Json response with the http status 200.
        return $this->apijsonresponse->_200Ok('this is an ok results');
    } // index
}

上面的路由 / 读取 DATABASE_URL 环境变量并返回以下 JSON 数据。

{
    "status": 200, 
    "message": "",
    "results": "this is an ok results"
}

许可证

此包处于 MIT 许可证之下。请参阅包中的完整许可证 在此

关于我们

TranoUtilsBundle 是 atety(https://www.atety.com)的倡议。