hal(zend-expressive-hal + zend-router)中生成的链接不完整

时间:2018-11-13 20:06:09

标签: zend-expressive zend-router

我的路线定义:

'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,
                        ],

                    ],
                ],

            ],

        ],
    ],

Medatada地图定义:

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框架。.

1 个答案:

答案 0 :(得分:0)

对不起,我忘记了上周做过的事情:(

必须为UrlGeneratorInterface完成一些自定义实现,才能成功将zend-expressive-hal与zend框架集成在一起(原始类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);
    }
}

我希望代码可以对某人有所帮助。