tempest-tools/tempest-tools-skeleton

基于:mitchdav/laravel-versioned-api。这个分支是为了创建API的一站式解决方案而设计的。它利用了许多其他第三方库和其他tempest工具组件。

安装: 5

依赖者: 0

建议者: 0

安全: 0

星标: 1

关注者: 2

分支: 8

类型:项目

2.0.4 2019-08-06 23:47 UTC

README

这是一个我正在制作的骨架,它将包含所有常见网络应用程序所需的功能,以及一套用于更快、更安全、更广泛地构建API的工具,比我所遇到的任何其他项目都要好。

在过去的近15年里,我一直在制作网络应用程序,我遇到了许多编写糟糕的项目。我用这段时间收集了我认为理想项目应该是什么样子的笔记,并思考了创建一个工具集的最佳方式,以编写满足以下要求的API:

  1. 尽可能快地设置和配置
  2. 安全
  3. 灵活且可扩展,足以允许API的核心代码轻松适应任何场景
  4. 使用和理解上保持一致。

我也一直想知道为什么有这么多特性是99%的网络应用程序所必需的,但仍然没有一种方法可以开始一个项目,这些特性已经编写并协同工作。

我的目标是让Tempest Tools和这个骨架成为对这些需求的回答;这是新Laravel项目的理想起点。我正在制作的骨架将包含所有常见网络应用程序所需的功能,以及一套用于更快、更安全、更广泛地构建API的工具。

随着新工具被添加到骨架中,我将它们连接起来。因此,这个骨架将作为所有包含工具的工作示例,并且是任何新Laravel项目的完美起点。

这个骨架还包含了其他Tempest Tools包的测试用例。

Tempest Tools Skeleton仍在开发中,所以如果您遇到问题,请报告它,并/或发送一个拉取请求以修复问题。

请注意,包文件夹包含第一方组件。

Tempest Tools Skeleton是Laravel版本化API的分支。请参阅:https://github.com/mitchdav/laravel-versioned-api

当前v2.0.4中包含的内容(第一方)

  1. https://github.com/tempestwf/tempest-tools-common
  • 包含其他Tempest Tools包使用的通用库。
  1. https://github.com/tempestwf/tempest-tools-moat
  • 包含易于配置的中间件,可以将它们应用于任何路由,根据允许开发者轻松定义哪些权限(存储在数据库中)的模板系统来限制对其的访问。
  1. https://github.com/tempestwf/tempest-tools-raven
  • 包含易于配置基于事件的通信和实时警报的工具。
  1. https://github.com/tempestwf/tempest-tools-scribe
  • 编写RESTful API最快、最安全、最可扩展的方式。
  1. 注册/用户电子邮件验证。
  2. 从第三方服务(Google、Facebook、Twitter)进行OAuth登录。
  3. 改进的本地化功能。
  4. 用户管理系统。

当前v2.0.4中包含的内容(第三方)

  1. laravel-versioned-api提供的所有内容
  2. https://packagist.org.cn/packages/laravel-doctrine/extensions
  3. https://packagist.org.cn/packages/gedmo/doctrine-extensions
  4. https://packagist.org.cn/packages/beberlei/DoctrineExtensions
  5. https://packagist.org.cn/packages/laravel-doctrine/migrations
  6. https://packagist.org.cn/packages/laravel-doctrine/acl

当前正在开发中

  1. Tempest Tools 缓存标签系统
  • 根据 Tempest Tools Common ArrayHelper 的模板系统对缓存项进行标签化。将标签应用于不支持标签的分布式缓存环境。

计划事项

  1. 改进错误处理和日志记录。
  2. 支持代码模块化。
  3. 更好地实现 Gedmo 扩展(将扩展应用于提供的实体)。
  4. 全文搜索。
  5. 结果缓存。
  6. 大数据集的数据库分片。

需求

  • PHP >= 7.1.0
  • Composer
  • laravel/framework 5.3.*
  • laravel-doctrine/orm 1.2.*,
  • 缓存系统(Redis、Memcached、文件缓存)
  • 数据库(MySQL 或 Laravel 和 Doctrine 支持的其他数据库)

安装

您可以先分叉仓库,然后更新下面的 git clone 命令。或者,您可以可选地将克隆的仓库保存到您自己的仓库中。

注意:在运行 composer install 之前,请确保关闭 xdebug,因为它可能会导致它无限期地挂起(设置 xdebug: "xdebug.remote_autostart=0" 应该解决这个问题)。通过在终端运行以下命令手动克隆仓库。我们进行手动克隆,以便运行子模块命令。

git clone https://github.com/tempestwf/tempest-tools-skeleton {name of directory to clone into}
cd {name of directory to clone into}
git submodule init
git submodule update
composer install
php -r "copy('.env.example', '.env');"
php artisan key:generate
php artisan jwt:generate

如果您想要一个不包含专辑和艺术家以及相关测试的纯实现,您可以将分支切换到 vanilla。

git checkout 2.0.2-vanilla

在 .env 中为您的 API 命名

API_NAME="{API Name}"

在 .env 文件中设置您的附加信息。请记住,在测试之前,您还必须在系统上设置主机。

APP_URL=http://{site url}
API_DOMAIN={domain}

此外,在 .env 文件中,您必须设置一个基本用户。此用户将被添加到 DB 中,并且需要用户进行的测试用例将使用此用户运行。

BASE_USER_NAME="{name}"
BASE_USER_EMAIL={email}
BASE_USER_PASSWORD={password}

这将设置项目的依赖项,但是您仍然需要设置数据库。您必须首先创建一个 MySQL 数据库,然后将其详细信息存储在 .env 文件中,如下所示。

DB_DATABASE={database}
DB_USERNAME={username}
DB_PASSWORD={password}

如果您有缓存驱动程序,请添加以下行。

CACHE_DRIVER={cache driver name}
SESSION_DRIVER={cache driver name}
QUEUE_DRIVER={cache driver name}

如果缓存驱动程序是 redis,您应该指定如下设置。

REDIS_HOST={host}
REDIS_CLIENT={client}
REDIS_PASSWORD={password}
REDIS_PORT={port}

截至目前,我们支持 Facebook、Twitter 和 Google 在 Socialite 插件上。您可以通过添加以下行来指定账户。

FACEBOOK_KEY={key}
FACEBOOK_SECRET={secret}
FACEBOOK_REDIRECT_URI=http://api-dev.aki.com/auth/authenticate/callback/facebook

TWITTER_KEY={key}
TWITTER_SECRET={secret}
TWITTER_REDIRECT_URI=http://api-dev.aki.com/auth/authenticate/callback/twitter

GOOGLE_KEY={key}
GOOGLE_SECRET={secret}
GOOGLE_REDIRECT_URI=http://api-dev.aki.com/auth/authenticate/callback/google

如果您此时想要将修改后的仓库保存到其自己的仓库中,可以使用以下命令。

git push https://{username}:{password}@github.com/{your github user}/{your repo} +{branch of the skeleton you want to copy}:master

将您的仓库的来源设置为您推送到的新位置。

 git remote set-url origin https://{username}:{password}@github.com/{your github user}/{your repo}

然后,我们使用 Doctrine 的辅助命令来构建我们的模式和代理。迁移文件位于 ./database/migrations,目前为空。运行 migrations:diff 生成第一个迁移文件,它将基于实体生成。然后运行 migrations:migrate 将其放入数据库中。此外,运行 generate:proxies 为每个实体创建代理。

php artisan doctrine:migrations:diff
php artisan doctrine:migrations:migrate
php artisan doctrine:generate:proxies

此时,您的数据库仍然为空。请运行生成器以填充权限和身份验证必需品,添加基本用户和一些示例记录。生成器文件位于 ./database/seeds

php artisan db:seed
php artisan db:seed --class=SampleRecordsSeeder

登录

/auth/authenticate 发送 POST 请求,将 Content-Type 设置为 application/json。JSON 结构应如下所示

{
    "email": "{email address from env}",
    "password": "{email address from env}"
}

如果响应成功,您将收到一个令牌,您可以使用它向服务器发送后续请求,同时保持给定的用户身份验证。要通过令牌值发送,请将其作为以下方式发送到 Authorization 标头

Authorization: Bearer {token}

要获取用户详情,请向 /auth/me 发送 GET 请求,您将收到如下请求

{
    "id": 1,
    "email": "theodora39@example.net",
    "name": "Dillon Effertz",
    "job": "Roofer"
}

有关向服务器发送请求的更多信息,请参阅 Dingo API Wiki

开发服务器

当您对实体进行更改时,您需要为实体生成代理,以便系统可以快速加载每个请求。为此,请在终端中运行以下命令

php artisan doctrine:generate:proxies

除非您修改了实体,否则这并不是必需的,因为它们的代理已经生成并提交。

如果您的实体更改修改了其数据库结构,您可以运行以下命令来创建基于更改的迁移

php artisan doctrine:migrations:diff
php artisan doctrine:migrations:migrate

路由

您可以通过查看[路由文件]来获取版本的路由。

参见:tempest-tools-moat (https://github.com/tempestwf/tempest-tools-moat) 以获取有关将 acl 中间件添加到路由的信息。

添加新版本

重要的文件都包含在 app/API 文件夹中。该项目有同一 API 的 3 个不同版本,以尽可能保持简单以便扩展。

当您想添加新版本时,您需要遵循以下过程

  1. 将整个上一个版本的文件夹复制到 app/API 文件夹中,并给它一个合适的名称(例如,将 app/API/V3 文件夹复制到 app/API/V4

  2. 进行搜索和替换操作以更新文件夹的引用,从上一个版本更新到新版本(例如,在 V4 文件夹中将所有 V3 实例更新为 V4

  3. 将上一个版本中存在的路由复制到路由文件中的新版本

  4. 更新 config/api.php 文件,以便在 auth 部分包含新版本

  5. 更新 .env 文件中的 API_VERSION 变量为新版本

  6. 对 API 的新版本进行更改(例如,添加新实体或对现有实体的字段进行更改)

  7. 运行以下命令以更新数据库架构和代理

     php artisan doctrine:migrations:diff
     php artisan doctrine:migrations:migrate
     php artisan doctrine:generate:proxies
    
  8. 在路由文件中添加任何新端点的路由

  9. 以防 APP_URL 缺失,您可以运行以下行

     php artisan config:clear
    

移除版本

要移除版本,请遵循以下过程

  1. app/API 文件夹中移除版本的文件夹
  2. 从路由文件中移除已移除版本的路线
  3. config/api.php 文件中移除 auth 条目
  4. 检查 .env 文件中的 API_VERSION 变量是否未设置为已移除的版本

本地化

默认情况下,我们使用 ageras-com/laravel-onesky 作为翻译包装器。这是 OneSky 与系统的无缝集成。它使用 artisan 运行,具有拉取和推送功能。这意味着我们不需要手动上传和下载翻译。

  1. 将 ONESKY_API_KEY 和 ONESKY_SECRET 添加到您的 .env 文件中
  2. 创建系统的基本区域设置。默认情况下,我们使用 'en' 作为默认设置。翻译文件位于 resources/lang 文件夹中,并且每个区域文件夹都是分开的。
  3. 当您准备好翻译语言文件时,使用以下简单的 artisan 命令将它们上传到您的 OneSky 账户
        php artisan onesky:push        
  1. 当您的语言文件已被翻译后,使用此命令直接将它们下载到项目中
        php artisan onesky:pull
  1. 如果您只想拉取某些语言,可以使用 --lang= 标志
        php artisan onesky:pull --lang=en,da,no
  1. 如果您有多个项目,可以使用 --project= 标志来指定 ID
        php artisan onesky:push --project=1337

注意:您可以在 app.php 配置文件中找到默认的区域设置回退。要翻译,您可以使用 trans() 进行翻译(例如:echo trans('auth_failed');)。有关参考,您可以查看 https://packagist.org.cn/packages/ageras/laravel-onesky

已知不规则性

当在composer.json中添加库或在.env文件中添加值时,有时它不会立即反映出来。如果你遇到这种情况,你可能需要运行以下命令

    composer dump-autoload -o
    php artisan config:clear
    php artisan cache:clear