Как получить базовый URL программно в zend expressive?

#php #environment-variables #base-url #mezzio

#php #переменные среды #базовый URL #mezzio

Вопрос:

Я работаю над приложением API, которое будет запускаться в разных доменах: http://example.com /, http://sub.example.com /, http://example-another.com /. Часть ответов API должна отправлять его base_url. Итак, я пытаюсь найти способ динамически собирать base_url и добавлять его в свой ответ.

У меня есть factory для запуска обработчика действий следующим образом:

 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 world, и я нашел https://github.com/zendframework/zend-http/blob/master/src/PhpEnvironment/Request.php вероятно, потенциальное решение моей проблемы. Однако я не знаю, как получить этот объект PHP-Environment (или любой другой объект, который поможет мне получить базовый URL) в классе factory или handler.

Ответ №1:

zend-http не используется в expressive, он предназначен для zend-mvc. В expressive используются интерфейсы HTTP-сообщений PSR-7, и по умолчанию это обрабатывается в zend-diactor.

 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

РЕДАКТИРОВАТЬ: вы не можете получить детали запроса на самой фабрике. Это может быть сделано только в промежуточном программном обеспечении или обработчиках (которые являются своего рода промежуточным программным обеспечением).

Комментарии:

1. Спасибо. это работает. На самом деле, я попробовал более объектно-ориентированный подход, который также помог $request->getUri()->withUserInfo("")->withPath("")->withQuery("")->withFragment("")