有很好的教程如何在像这样的控制器中创建URL。例如:
$this->uriBuilder->reset()->setTargetPageUid($page_uid)->setCreateAbsoluteUri(TRUE)->build();
$this->controllerContext->getUriBuilder()->reset()->setTargetPageUid($page_uid)->setArguments(array('person'=>$person->getUid())->buildFrontendUri();
来自控制器的作品。但我不能在存储库中做同样的工作。错误日志说第一个示例中的reset()和第二个示例中的getUriBuilder在从存储库完成时在非对象上调用。
有关如何过去的任何线索?
答案 0 :(得分:2)
首先,你不应该这样做。要在Extbase中创建URI,您需要访问当前的控制器上下文,因为创建URI有几个因素(当前称为控制器操作,当前主机名,所选语言,......) 。如果要在存储库(即数据访问层)中创建URI,则会生成对Extbase框架的HTTP路由层的依赖关系。从架构的角度来看,这是不可取的,因为可以认为它违反了关注点分离并造成了混乱的交叉依赖。
话虽如此,如果您仍想这样做(而不是在控制器中生成URI,或者 - 更好 - 使用 Fluid viewhelper ):构建URI所需的全部内容是: UriBuilder
类的一个实例。没有什么能阻止您将控制器的UriBuilder
实例传递到存储库中,例如作为参数:
public function fooAction() {
$records = $this->myRepository->findRecordsWithUri($this->uriBuilder);
}
在您的存储库函数中,只需使用传递的UriBuilder
实例,就像在控制器中一样。