Неполные ссылки, сгенерированные в hal (zend-expressive-hal + zend-router) - PullRequest
0 голосов
/ 13 ноября 2018

Мои маршруты 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,
                        ],

                    ],
                ],

            ],

        ],
    ],

Карта карты Медатада:

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-Expressive просто Zend-Framework ..

1 Ответ

0 голосов
/ 16 ноября 2018

Извините, я забыл, что я сделал на прошлой неделе: (

Необходимо сделать некоторую пользовательскую реализацию для 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);
    }
}

Надеюсь, код может кому-нибудь помочь.

...