#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("")