首页 > 解决方案 > 如何在zend expressive中以编程方式获取基本url?

问题描述

我正在开发一个将在不同域中运行的 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 的对象)。

标签: phpenvironment-variablesbase-urlmezzio

解决方案


zend-http 不用于表达,它用于 zend-mvc。在富有表现力的 PSR-7中使用 HTTP 消息接口,默认情况下这在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

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


推荐阅读