我正在开发一个TYPO3扩展,以连接到具有REST-API的外部应用程序。我想要的只是从我的 REST-API 中检索数据并将这些数据传递给控制器。由于我对 extbase 开发很陌生,所以我并没有真正找到任何关于存储库与 Web 服务交互的资源。仅有关与数据库交互的存储库的文档(MySQL,PostgreSQL等( 我想知道,我应该在哪里放置 cURL 请求函数以连接到 API?在模型中?在存储库中?扩展中的控制器如何访问该数据?从模型还是存储库?
从外部应用程序/数据库中检索数据的最佳实践是什么?(从应用程序检索的数据是 JSON 格式的( 感谢您的任何建议/帮助!
我们通常做的是创建一个服务(Classes/Service
(,并使用它来连接到Web服务并获取数据。如果你想要模型,你也可以在那里创建它们。
但是,现在我想到了,从技术上讲,它应该是一个存储库。存储库从何处获取数据并不重要。Extbase 对于完全自定义的存储库(不扩展任何其他类(应该没有任何问题。
让我们采用一个简单的列表 ->详细信息视图,并使其尽可能简单,以便获得一些结果。然后,您可以添加一些帮助程序类并通过命名空间等包含它们。
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)
TYPO3CMSExtbaseUtilityDebuggerUtility::var_dump($decodedEvents);
$this->view->assign('events', $decodedEvents);
}
列表 HTML(您的扩展/资源/私有/模板/事件/列表(
<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>
这样做的目的是生成一个链接,该链接链接到带有额外参数的详细信息操作,即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)
TYPO3CMSExtbaseUtilityDebuggerUtility::var_dump($decodedEvent );
$this->view->assign('event', $decodedEvent );
}
这样做的目的是检索我们指定的参数,以获取事件的标识符并将其包含在您的 api 请求中以取回事件。然后我们只需将其解码为普通数组,然后将结果发送到前端。
详细信息 HTML(您的扩展/资源/私有/模板/事件/详细信息(
<h2>{event.title}</h2>
这是一个简单的列表 -> TYPO3 的详细信息。您经常会看到详细信息视图显示为显示,但基本上是相同的。
您可以将变量替换为虚拟 json 值并尝试一下。我在编写此答案时测试了代码,它可以工作。
课程/服务
至于Rudy Gnodde提到的类/服务,你可以把你的库放在那里(假设你已经编写了一些函数,如getEvent,getAllEvents,getPersons等(,然后在控制器中调用它们。
use VendorYourExtensionServiceRestApiClass;
/**
* 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)
TYPO3CMSExtbaseUtilityDebuggerUtility::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)
TYPO3CMSExtbaseUtilityDebuggerUtility::var_dump($decodedEvent );
$this->view->assign('event', $decodedEvent );
}
如果您需要更多信息,请随时询问。
此致敬意