如何在 zend 表达式中以编程方式获取基础 url?

How to get the base url Programatically in zend expressive?

我正在开发一个 API 应用程序,它将 运行 在不同的域中:http://example.com/, http://sub.example.com/, http://example-another.com/。部分 API 响应需要发送其 base_url。所以我试图找到一种方法来动态收集 base_url 并将其添加到我的响应中。

我有一个工厂来启动动作处理程序,如下所示:

class TestHandlerFactory
{
    public function __invoke(ContainerInterface $container) : TestHandler
    {

        return new TestHandler();
    }
}

那么我的action handler如下:

class TestHandler implements RequestHandlerInterface
{
    public function __construct()
    {
        ...
    }
    public function handle(ServerRequestInterface $request) : ResponseInterface
    {

       ...
    }
}

我是 Zend 世界的新手,我发现 https://github.com/zendframework/zend-http/blob/master/src/PhpEnvironment/Request.php 可能是我问题的潜在解决方案。但是,我不知道如何在工厂或处理程序 class.

中获取 PHP-Environment 对象(或帮助我获取基础 url 的任何其他对象)

zend-http 不是用在表达上,是给zend-mvc用的。在表达 PSR-7 HTTP message interfaces are used and by default this is handled in zend-diactoros.

class TestHandler implements RequestHandlerInterface
{
    public function handle(ServerRequestInterface $request) : ResponseInterface
    {
        // Get request URI
        $uri = $request->getUri();
        // Reconstruct the part you need
        $baseUrl = sprintf('%s://%s', $uri->getScheme(), $uri->getAuthority());
    }
}

可在此处找到更多信息:https://github.com/zendframework/zend-diactoros/blob/master/src/Uri.php

编辑:您无法在工厂本身获取请求详细信息。这只能在中间件或处理程序(一种中间件)中完成。