networkteam/neos-contentapi

Neos 内容 API

v0.11.0-beta 2024-07-04 11:57 UTC

README

概念

站点处理

内容 API 将使用请求的当前域名/站点,因此在多站点安装中请确保通过正确的域名调用 API。

通过 Fusion 扩展

API 响应由 Fusion 原型声明。这允许高度灵活和定制。

简单 API

此包不提供复杂的节点查询 API。它主要关注使用 Neos 作为无头 CMS 时,基于文档节点的页面渲染。它也非常适合与 @networkteam/zebra 配对,并支持节点的完全视觉编辑。

可以通过路径(公开访问)或上下文路径(在工作空间中预览时访问)获取节点。

特性

  • 支持多站点安装
  • 支持维度(例如,用于多语言站点)
  • 支持 Flowpack.Neos.DimensionResolver 进行灵活的维度路由
  • 支持 Neos.RedirectHandler(如果已安装)并在设置中启用 checkRedirects

配置

Networkteam:
  Neos:
    ContentApi:
      recursiveReferencePropertyDepth: 1
      documentList:
        ignoredNodeTypes:
          - 'Neos.Neos:Shortcut'
      # Enable to check redirects of RedirectsHandler (if package is available) if a node is not found
      checkRedirects: false

示例

为文档节点类型添加 API 原型

prototype(Neos.Demo:Document.Page.Api) < prototype(Networkteam.Neos.ContentApi:DefaultDocument) {
	content {
		main = Neos.Neos:ContentCollection {
			nodePath = 'main'
		}
		teaser = Neos.Neos:ContentCollection {
			nodePath = 'teaser'
		}
	}
}
prototype(Neos.Demo:Document.LandingPage.Api) < prototype(Neos.Demo:Document.Page.Api)
prototype(Neos.Demo:Document.Homepage.Api) < prototype(Neos.Demo:Document.Page.Api)

这里的想法是为完整的文档节点类型层次结构创建一个 .Api 原型。内容以及任意数据都可以添加到原型中,并将其序列化为 JSON。

扩展 API 站点属性

contentApi {
	site {
		# Set some additional context variables for default Fusion to work correctly
		@context {
			documentNode = ${site}
			node = ${site}
		}
		navigation = Neos.Fusion:DataStructure {
			mainItems = Neos.Fusion:Map {
				items = ${q(site).children('[instanceof Neos.Neos:Document][_hiddenInIndex=false]')}
				itemName = 'node'
				itemRenderer = Neos.Fusion:DataStructure {
					title = ${q(node).property('title')}
					renderPath = Neos.Neos:NodeUri {
						node = ${node}
						format = 'html'
					}
				}
			}
		}
		content {
			footer = Neos.Neos:ContentCollection {
				nodePath = 'footer'
			}
		}
	}
}

这可以通过当前站点的 /content-api/site 端点获取(取决于域名)。

提供查询列表数据

contentApi {
  queries {
    # Declare a simple query that can be used to fetch articles
    articles = Networkteam.Neos.ContentApi:Query.FlowQuery {
      items = ${q(site).find('[instanceof Zebra.Site:Document.Article]')}
      itemName = 'node'
      itemRenderer = Networkteam.Neos.ContentApi:BaseNode

      page = ${params.pagination.page || 0}
      perPage = ${params.pagination.perPage || 3}
    }
  }
}

此查询可以通过 /content-api/query/articles 端点获取。它使用预定义的 Networkteam.Neos.ContentApi:Query.FlowQuery 基于预定义的 FlowQuery 表达式获取数据。

注意:对于更复杂的查询,您可以创建自己的查询实现,例如基于搜索实现以实现更有效的查询。

API 端点

/neos/content-api/documents

列出具有路由路径/上下文路径和遍历维度的可用文档。

可以通过 workspaceName 选择不同的工作区(需要身份验证)。

注意:如果 Flowpack.Neos.DimensionResolver 已经根据域名等解析了维度,则不会遍历维度。

/neos/content-api/document

根据 pathcontextPath 渲染文档。

/neos/content-api/node

根据 contextPath 渲染单个节点。

/neos/content-api/site

独立于单个节点渲染站点属性。

/neos/content-api/query/{queryName}

获取预定义查询的数据。

查询参数

  • params:查询参数(过滤器、排序、分页等)。它取决于 Fusion 实现,支持哪些确切参数。
  • workspaceName:节点上下文的工作区名称(默认为 live)
  • dimensions:节点上下文的维度

响应

查询实现应返回包含数据和元信息的 JSON 结果

{
  "data": [{ ... }],
  "meta": {
    "total": 0
  }
}