TYPO3 Webservice/Rest API 作为 Extbase 扩展的存储库

TYPO3 Webservice/Rest API as Repository for Extbase Extension

我正在开发一个 TYPO3 extbase 扩展来连接到我的具有 REST-API 的外部应用程序。我只想从我的 REST-API 检索数据并将该数据传递给控制器​​。由于我是 extbase 开发的新手,所以我没有真正找到任何关于 Repository 与 web 服务交互的资源。仅有关与数据库交互的存储库的文档(MySQL、PostgreSQL、..) 我想知道,我应该在哪里放置 cURL 请求函数以连接到 API?在模型中?在存储库中?我的扩展中的控制器如何访问该数据?来自模型还是存储库?

从外部 application/database 检索数据的最佳做法是什么? (从应用程序中检索到的数据是 JSON 格式的) 感谢您的任何建议/帮助!

我们通常做的是创建一个服务(在 Classes/Service 中)并使用它来连接到网络服务并获取数据。如果你想要模型,你也可以在那里创建它们。

不过,现在想想,从技术上讲,它应该是一个Repository。 Repository 从哪里获取数据并不重要。 Extbase 不应该对完全自定义的存储库有任何问题(不扩展任何其他 class)。

让我们采用一个简单的列表 -> 详细视图并使其尽可能简单,以便获得一些结果。然后你可以添加一些助手 类 并通过命名空间等包含它们

ListAction (yourExtension/Classes/Controller/EventController)

/**
* action list
*
* @return void
*/
 public function listAction()
 {
      $events =  (some function which gets all the available events and results to a json output)
      $decodedEvents = json_decode($events , true);

      (in case you need to see what you got back)
      \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($decodedEvents);

      $this->view->assign('events', $decodedEvents);
 }

列表HTML (yourExtension/Resources/Private/Templates/Event/List)

<f:for each="{events}" as="event">
      <h2>{event.title}</h2>
</for>

现在,如果我没记错的话,每个事件都有一个 uid 或标识它的东西。因此,在同一个模板上,您可以执行以下操作:

<f:for each="{events}" as="event">
      <h2>{event.title}</h2>
      <f:link.action action="detail" arguments="{eventId: event.uid}">More</f:link.action>
</f:for>

它的作用是生成一个 link,其中 link 带有一个额外参数 eventId 到您的详细操作。

Bedore TYPO3 呈现详细信息页面,它将通过您的详细信息操作获取此特定事件的信息以便显示它们。

DetailAction (yourExtension/Classes/Controller/EventController)

/**
* action detail
*
* @return void
*/
 public function detailAction()
 {
      $args = $this-request->getArguments();
      $eventId = $args['eventId'];

      $getEvent = (some function that gets a specific id and results to a json output)
      $decodedEvent = json_decode($getEvent , true);

      (in case you need to see what you got back)
      \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($decodedEvent );

      $this->view->assign('event', $decodedEvent );
 }

这是做什么的,它检索我们指定的参数以获取事件的标识符并将其包含在您的 api 请求中以取回事件。然后我们只是将它解码为普通数组,然后将结果发送到 FrontEnd。

详情HTML (yourExtension/Resources/Private/Templates/Event/Detail)

<h2>{event.title}</h2>

这是一个简单的列表 -> TYPO3 的详细过程。您经常会看到 detail 视图与 show 视图基本相同。

您可以将变量替换为虚拟 json 值并进行尝试。我在写这个答案时测试了代码并且它有效。

Classes/Service

至于 Rudy Gnodde 提到的 Classes/Service,您可以将您的库放在那里(假设您已经编写了一些函数,如 getEvent、getAllEvents、getPersons 等),然后在控制器。

use \Vendor\YourExtension\Service\RestApiClass;

/**
* action list
*
* @return void
*/
 public function listAction()
 {
      $events =  RestApiClass::getAllEvents();
      $decodedEvents = json_decode($events , true);

      (in case you need to see what you got back)
      \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($decodedEvents);

      $this->view->assign('events', $decodedEvents);
 }

/**
* action detail
*
* @return void
*/
 public function detailAction()
 {
      $args = $this-request->getArguments();
      $eventId = $args['eventId'];

      $getEvent = RestApiClass::getEvents($eventId);
      $decodedEvent = json_decode($getEvent , true);

      (in case you need to see what you got back)
      \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($decodedEvent );

      $this->view->assign('event', $decodedEvent );
 }

如果您需要更多信息,请随时询问。

此致