当然。与普通的 GET 请求实际上相同,只是您会动态响应,因为它涉及xml http request。
以下面indexAction为例
use Zend\View\Model\JsonModel;
// class, other use-statements, etc
public function indexAction()
{
$page = $this->params()->fromQuery('page', 1); // get page from GET, default page 1
/** @var QueryBuilder $qb */
$qb = $this->getObjectManager()->createQueryBuilder();
$qb->select('u')
->from(User::class, 'u')
->orderBy('u.createdAt', 'DESC');
$paginator = new Paginator(new OrmAdapter(new OrmPaginator($qb)));
$paginator->setCurrentPageNumber($page);
$paginator->setItemCountPerPage(25);
if ($this->getRequest()->isXmlHttpRequest()) {
return new JsonModel([
'paginator' => $paginator,
'queryParams' => $this->params()->fromQuery(),
]);
}
return [
'paginator' => $paginator,
'queryParams' => $this->params()->fromQuery(),
];
}
对于标准 GET 请求,您通常会在最底部的 return 语句中结束。在 ajax 类型请求的情况下,语句 $this->getRequest()->isXmlHttpRequest() 返回 true 并且您知道它是通过发送的,比如说 $.ajax / $.get / $.post(通常,除非本机 JS 或类似的东西)。在这些情况下,您只想使用数据而不是完全渲染的视图进行响应。这是您返回 JsonModel 的时间。
为确保它按预期工作,您还必须在配置中启用JsonViewStrategy。您可能希望在您的 global.php 中启用此功能,而不仅仅是一个模块,如下所示,以便在任何地方启用它:
'view_manager' => [
//...
'strategies' => [
'ViewJsonStrategy',
],
],
那么,剩下要做的就是用 JavaScript 做客户端的事情了。比如确保更新分页、页面内容等。也许是一个 URI 锚点......