Неполные ссылки, сгенерированные в hal (zend-expressive-hal + zend-router)
Мои маршруты def:
'router' => [
'routes' => [
'TimeTable' => [
'type' => 'Literal',
'options' => [
// Change this to something specific to your module
'route' => '/tt',
],
'may_terminate' => false,
'child_routes' => [
'API' => [
'type' => 'Literal',
'options' => [
// Change this to something specific to your module
'route' => '/api',
],
'may_terminate' => false,
'child_routes' => [
'lines' => [
'type' => 'Literal',
'options' => [
// Change this to something specific to your module
'route' => '/lines',
'defaults' => [
'controller' => Controller\LineRestApiController::class,
],
],
'may_terminate' => true,
],
],
],
],
],
],
Медатада карта Def:
MetadataMap::class => [
[
'__class__' => RouteBasedCollectionMetadata::class,
'collection_class' => LineCollection::class,
'collection_relation' => 'lines',
'route' => 'TimeTable/API/Lines',
],
]
Сгенерированный результат:
{
"_total_items": 78,
"_page": 1,
"_page_count": 4,
"_links": {
"self": {
"href": "http://xxx.xxx.xx"
},
"next": {
"href": "http://xxx.xxx.xx"
},
"last": {
"href": "http://xxx.xxx.xx"
}
},
"_embedded": {
"lines": [.....] }}
Все ссылки сгенерированы с неполным href, есть только часть домена, часть маршрута удалена..
Ожидаемый результат примерно такой:
"href" : "http://xxx.xxx.xx/xxx/tt/api/lines....."
Я делаю что-то не так, я понятия не имею, с чего начать..
Спасибо всем за то, что дали мне несколько идей
Упрощенный код контроллера:
$psr7request = Psr7ServerRequest::fromZend($this->getRequest());
$list = this->entityManager->getRepository(Line::class)->getValidLinesCollection();
$resource = $this->resourceGenerator->fromObject($list, $psr7request);
echo Psr7Response::toZend($this->responseFactory->createResponse($psr7request, $resource))->getBody();
exit;
PS: я не использую полный Zend-выразительный просто Zend-Framework..
1 ответ
Извините, я забыл, что сделал на прошлой неделе:(
Должна быть сделана некоторая пользовательская реализация для UrlGeneratorInterface для успешной интеграции Zend-Expressive-Hal в Zend Framework (оригинальный класс ExpressiveUrlGenerator использует Expressive \Helper\ServerUrlHelper & UrlHelper, часть Expressive)
Поэтому я использовал Zend \ View \Helper\ServerUrl & Url, чтобы сделать это.
У меня есть небольшая опечатка в коде. Последний класс здесь:
use Psr\Http\Message\ServerRequestInterface;
use Zend\Expressive\Hal\LinkGenerator\UrlGeneratorInterface;
use Zend\View\Helper\ServerUrl as ServerUrlHelper;
use Zend\View\Helper\Url as UrlHelper;
class HalUrlGenerator implements UrlGeneratorInterface
{
/**
* @var null|ServerUrlHelper
*/
private $serverUrlHelper;
/**
* @var UrlHelper
*/
private $urlHelper;
public function __construct(UrlHelper $urlHelper, ServerUrlHelper $serverUrlHelper = null)
{
$this->urlHelper = $urlHelper;
$this->serverUrlHelper = $serverUrlHelper;
}
public function generate(
ServerRequestInterface $request,
string $routeName,
array $routeParams = [],
array $queryParams = []
) : string {
$urlHelper = $this->urlHelper;
$path = $urlHelper($routeName, $routeParams, ['query'=> $queryParams]);
if (! $this->serverUrlHelper) {
return $path;
}
$serverUrlHelper = $this->serverUrlHelper;
return $serverUrlHelper($path);
}
}
Я надеюсь, что код может помочь кому-то.