getpop/application

创建一个基于组件的应用程序

1.0.6 2023-09-07 09:14 UTC

README

创建一个基于组件的网站

安装

通过Composer

composer require getpop/application

开发

源代码托管在GatoGraphQL monorepo上,位于SiteBuilder/packages/application

用法

初始化组件

\PoP\Root\App::stockAndInitializeModuleClasses([([
    \PoP\Application\Module::class,
]);

主要概念

多域名

PoP已被构建以支持去中心化:模块可以从与托管应用程序不同的域名/子域名中获取数据。例如,一个应用程序可以从子域名检索其组件

Modules can have their data fetched from different domains and subdomains

单个组件也能够有多个数据源,每个源都来自不同的域名/子域名。例如,SukiPoP.com中的活动日历显示来自几个外部网站的事件,并使用不同的颜色绘制事件,以根据源域名进行区分

Multidomain events calendar

架构设计和实现

数据加载

懒加载

我们可以通过将数据加载模块的prop "lazy-load"设置为true来指示数据加载模块为懒加载(即,而不是立即获取其数据库数据,而是在随后的客户端请求中获取)

function initModelProps($component, &$props) 
{
  switch ($component->name) {
    case self::COMPONENT_AUTHORARTICLES:

      // Set the content lazy
      $this->setProp($component, $props, 'lazy-load', true);
      break;
  }

  parent::initModelProps($component, $props);
}

作为一个prop,这个值可以由数据加载模块本身设置,或者由其任何祖先模块设置

function initModelProps($component, &$props) 
{
  switch ($component->name) {
    case self::COMPONENT_AUTHORARTICLESWRAPPER:

      // Set the content lazy
      $this->setProp([COMPONENT_AUTHORARTICLES], $props, 'lazy-load', true);
      break;
  }

  parent::initModelProps($component, $props);
}

以下是几个用于模块数据懒加载的用例

  • 显示在多个页面上的模块(例如:侧边栏上的“最新帖子”小部件)可以将其数据缓存在客户端(例如:通过Service Workers、localStorage等),并通过懒加载,每次请求服务器时都不会再次获取此数据
  • 从不同域名获取数据
  • 通过懒加载底部内容模块(例如:帖子的评论)的数据来提高感知加载速度
  • 在没有用户状态的页面上获取具有用户状态的数据(如本处所述

多域名

默认情况下,模块将从应用程序托管的主域名中获取其数据。要将其更改为不同的域名(或子域名),请在模块上设置prop "dataload-multidomain-sources"

function initModelProps($component, &$props) {
    
  switch ($component->name) {
    case self::COMPONENT_SOMENAME:

      $this->setProp(
        $component, 
        $props, 
        'dataload-multidomain-sources', 
        'https://anotherdomain.com'
      );
      break;
  }

  parent::initModelProps($component, $props);
}

我们还可以传递一个域名数组,在这种情况下,模块将从所有这些域名中获取其数据

function initModelProps($component, &$props) {
    
  switch ($component->name) {
    case self::COMPONENT_SOMENAME:

      $this->setProp(
        $component, 
        $props, 
        'dataload-multidomain-sources', 
        array(
          'https://anotherdomain1.com',
          'https://subdomain.anotherdomain2.com',
          'https://www.anotherdomain3.com',
        );
      break;
  }

  parent::initModelProps($component, $props);
}

在从多个源获取数据时,每个源都会在QueryInputOutputHandler中保持自己的状态。然后,它能够从不同的域名获取不同数量的数据(例如,来自domain1.com的3个结果和来自domain2.com的6个结果),并在没有更多结果时停止从特定域名查询。

由于外部应用可能安装了不同的组件,仅通过添加 ?output=json 来从外部应用获取数据并不能保证获取到原始应用所需的数据。为了解决这个问题,当从外部应用查询数据时,PoP 将使用 自定义查询 API 来精确获取所需的数据字段(这适用于获取数据库数据,但不适用于获取配置)。如果我们能够控制外部应用并且可以保证两个网站安装了相同的组件,那么我们可以将常量 EXTERNAL_SITES_RUN_SAME_SOFTWARE 定义为 true,这将允许通过常规的 ?output=json 请求获取数据库和配置数据。

PHP 版本

需求

  • 开发需要 PHP 8.1+
  • 生产需要 PHP 7.2+

支持的 PHP 功能

请查看 GatoGraphQL/GatoGraphQL 支持的 PHP 功能列表

预览降级到 PHP 7.2

通过 Rector(dry-run 模式)

composer preview-code-downgrade

标准

PSR-1PSR-4PSR-12

要检查编码标准,请运行 PHP CodeSniffer

composer check-style

要自动修复问题,请运行

composer fix-style

变更日志

有关最近更改的详细信息,请参阅 CHANGELOG

测试

要执行 PHPUnit,请运行

composer test

静态分析

要执行 PHPStan,请运行

composer analyse

报告问题

要报告错误或请求新功能,请到 GatoGraphQL monorepo 问题跟踪器 上操作。

贡献

我们欢迎在此包上的 GatoGraphQL monorepo(该包的源代码托管在此处)上的贡献。

请参阅 CONTRIBUTINGCODE_OF_CONDUCT 了解详细信息。

安全性

如果您发现任何与安全相关的问题,请通过电子邮件发送到 leo@getpop.org,而不是使用问题跟踪器。

鸣谢

许可

GNU 通用公共许可证 v2(或更新版)。有关更多信息,请参阅 许可文件