lexide/lazy-boy

一个使用Silex和Syringe以及支持Puzzle-DI的REST API应用程序框架

安装: 76

依赖者: 0

建议者: 0

安全性: 0

星星: 0

关注者: 2

分支: 0

类型:composer-plugin

3.1.0 2021-08-13 16:14 UTC

README

Lazy Boy将创建一个Silex框架的骨架,这样您就可以在不编写样板代码的情况下创建REST API。

摘要

Lazy Boy将创建一个Silex框架的骨架,以便您可以在不编写样板代码的情况下创建REST API。

它包含路由加载器并使用Syringe,允许您在配置文件中定义路由和服务,而不是在PHP中

如果您已安装Symfony console,它还将创建一个控制台脚本,并自动加载服务容器中找到的任何命令(任何以".command"结尾且是Symfony Command类实例的服务名称)。您还可以使用Puzzle-DI从模块中加载服务配置。

要求

安装

使用composer安装

composer require Lexide/lazy-boy:^2.0

每次运行composer updatecomposer install时,Lazy Boy会自动从模板生成几个文件。您可以自由修改;Lazy Boy不会覆盖已存在的文件,因此将这些更改提交到VCS是安全的。如果您的VCS忽略这些文件,则它们将在您安装克隆的仓库中的供应商时生成。

如果您想禁用自动文件生成,以便可以使用FrontController或RouteLoader等,请将以下内容添加到您的composer文件中

"extra": {
  "lexide/lazy-boy": {
    "prevent-install": true
  }
}

剩下的就是创建一个虚拟主机或以其他方式将请求指向web/index.php

路由

路由

如果您使用的是标准的Lazy-Boy路由加载器,您可以在配置文件中定义您的路由,使用YAML或JSON。每个路由都定义如下

routes:
    route-name:
        url: /sub/directory
        action: "test_controller:doSomething"
        method: post

routes是您想要允许访问的路由的关联数组。

在这种情况下,一个向/sub/directory发送了POST请求的HTTP请求将访问容器中的test-controller服务并调用其doSomething方法。此路由可以在使用路由器时引用为route-name

对于每个路由,urlaction参数是必需的,但method参数是可选的,默认为GET

您还可以使用assert参数来覆盖路由参数的默认正则表达式。例如

    routes:
        route-one:
            url: /user/{id}
            action: "test_controller:doSomething"
            method: get

URL /user/56将匹配,并且id参数将返回56。URL /user/56/foo不会匹配。

    routes:
        route-two:
            url: /user/{my_wildcard}
            action: "test_controller:doSomethingElse
            method: get
            assert:
                my_wildcard: ".*"

访问URL /user/56将匹配,并且再次,my_wildcard参数将返回56。访问URL /user/56/foo将匹配,并且my_wildcard参数将返回56/foo

分组

如果您有许多具有类似URL的路由,例如

  • /users
  • /users/{id}
  • /users/login
  • /users/logout

您可以使用一个分组来使用公共URL前缀将它们包装起来。

groups:
    users:
        urlPrefix: /users
        routes:
            user-list:
                url: /
                action: "..."
            get-user:
                url: /{id}
                action: "..."
            user-login:
                url: /login
                action: "..."
                method: post
            user-logout:
                url: /logout
                action "..."

导入

如果您有很多路由,将相关的路由分开到不同的文件中会方便很多。在这种情况下,您可以使用 导入 数组将文件导入父文件。

imports:
    - users.yml
    - shop/products.yml
    - shop/checkout.yml

groups:
    group: "..."
routes:
    route: "..."

导入的文件在处理路由和组之前将合并为一个配置数组。在路由命名冲突的情况下,后者导入将覆盖前者,并且导入的文件将优先于任何导入的路由。

已安装的库路由

如果安装了 Puzzle-DI,则已向 Lazy Boy 注册了路由文件的库可以将这些文件导入到 RouteLoader 中。使用此功能,库可以直接将路由及其控制器自动加载到 Silex 中,无需手动配置应用程序。

此功能与 Syringe 与 Puzzle-DI 的工作方式类似,因此如果您熟悉 Syringe,则添加库路由应该很容易。

要在库中注册路由文件,请将以下代码添加到库的 composer.json 文件中

"extra": {
  "lexide/puzzle-di": {
    "lexide/lazy-boy": [
      "path": "[ path to the route file, relative to the library package root directory ]"
    ]
  }
}

此外,您需要通过在应用程序的 composer.json 中添加以下内容来为 puzzle-di 启用库的使用权限

"extra": {
  "lexide/puzzle-di": {
    "whitelist": {
      "lexide/lazy-boy": [
        "[ your library's package name ]"
      ]
    }
  }
}

现在,当 composer 将依赖项安装到应用程序中时,库的路由文件将配置为与应用程序的任何路由一起加载。

配置

默认情况下,RouteLoader 限制 HTTP 方法为最常用的方法集:GETPOSTPATCHPUTDELETE。这可以通过更改 Syringe DI 配置值 router.allowedMethods 来自定义。

parameters:
    # ...
    router.allowedMethods:
        - "get"
        - "post"
        - "delete"
        - "connect" # added CONNECT method
        - "upsert"  # added custom / non-standard method 
        # PUT and PATCH methods are now disabled (not present in the list)

允许的方法值不区分大小写

提供者

CORS 提供者

CORS 提供者可用于使您的 API 能够接受跨域请求。默认情况下启用,并且可以通过向应用程序的 syringe 配置中添加以下参数来配置

允许的头部

parameters:
    cors.request.defaultHeaders:
# optional, automatically set to:
#     ["Content-Type", "Authorization"]
    cors.request.headers:
      - "X-CUSTOM-REQUEST_HEADER"
    cors.response.headers:
      - "X-CUSTOM-RESPONSE-HEADER"

这些参数允许客户端发送和接收额外的头部。cors.request.defaultHeaders 包含 Lazy-Boy 应用程序通常所需的头部,但如果需要删除这些头部,则可以覆盖。头部和默认头部将合并,因此您只需要设置这些配置选项,如果您需要使用额外的头部或限制头部。

允许的方法

parameters:
    # defaults to the value of router.allowedMethods
    cors.allowedMethods:
        - "get" 
        - "post"
        - "put"

allowedMethods 参数设置了哪些 HTTP 方法可用于您的 API。您可以使用这些方法使用比 RouteLoader 允许的更受限制的列表。在上面的示例中,仅允许 GETPOSTPUT 方法进行 CORS 请求,因此跨源源不能对 DELETE 发出请求。

OPTIONS 方法对于 CORS 的工作是必需的,因此会自动添加;它不需要在配置列表中

此外,很明显,但值得注意的是,任何不在 router.allowedMethods 配置列表中的允许 CORS 方法将无法工作,因为 RouteLoader 将拒绝它们。

自定义模板

Lazy Boy 使用一个简单的模板系统来创建标准的配置和入口点文件。可以将其钩入此系统以扩展 Lazy Boy 并安装自定义模板。

扩展库应按与 Lazy Boy 相同的方式安装;作为 composer 依赖项集成到应用程序中。库本身应按正常方式要求 Lazy Boy,然后添加额外的数据到 composer.json 文件以配置模板

{
  "name": "lexide/lazy-boy-extension",
  "require": {
    "lazy-boy": "^2.0.0"
  },
  "extra": {
    "lexide/lazy-boy": {
      "templates": {
        "template-name": {
          "template": "[ file path of the template, relative to the library package root directory]",
          "output": "[ file path of the output file, relative to the application root directory ]"
        },
        "index": {
          "template": "[ the 'index' template already exists. You can override a template like this ... ]"
        },
        "console": {
          "output": "[ ... or change where it's written to by overriding the output ]"
        }
      }
    }
  }
}

例如,在示例配置中,您可以通过使用相同的模板名称来替换现有的模板。您可以选择覆盖模板和/或输出文件位置。

目前定义了以下模板

* 此模板受保护,无法覆盖

** 此模板依赖于包列表中存在的 symfony/console

在应用程序中的使用

为了防止依赖项随意安装模板文件,Lazy Boy 需要您在应用中白名单包名,在安装任何自定义模板之前。这可以通过将以下代码添加到应用的 composer.json 文件中完成

"extra": {
  "lexide/lazy-boy": {
    "whiteListedPackages": [
      "your/package-name"
    ]
  }
}

贡献

如果您想看到改进,请在此 GitHub 项目中提交问题或更好的是,fork 项目,实现您的更改并创建一个 pull request。

该项目使用 PSR-2 代码风格,我们坚持认为必须严格遵守这些规范。此外,请确保您的代码与 php 5.4 兼容,因此应避免使用生成器、finallyempty(someFunction()) 等等。

为什么叫 "Lazy Boy"?

因为它喜欢 REST,当然 :)