如何在zend Express中以编程方式获取基本URL?

时间:2019-03-04 15:43:38

标签: php environment-variables base-url 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();
    }
}

然后我的动作处理程序如下:

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可能是解决我的问题的潜在方法。但是,我不能在工厂或处理程序类中获取该PHP-Environment对象(或任何其他可帮助我获取基本URL的对象)。

1 个答案:

答案 0 :(得分:1)

zend-http不用于表达,它用于zend-mvc。在具有表现力的PSR-7 HTTP message interfaces中使用,默认情况下,此问题在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

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