silktide/lazy-boy

一个使用Silex和Syringe,并支持Puzzle-DI的REST API应用骨架

5.0.0 2020-09-07 15:09 UTC

README

一个REST API应用骨架,使用SilexSyringe,并支持Puzzle-DI

概要

此项目的旧版本会生成模板。版本5仅在提供Lazy Boy的限制下工作,因此您可以在不处理样板代码的情况下创建REST API。

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

(本Readme的其余部分可能是无意义的)

需求

安装

使用Composer安装

composer require silktide/lazy-boy:^2.0

每当运行composer updatecomposer install时,Lazy Boy都会从模板自动生成几个文件。您可以自由地进行修改;Lazy Boy不会覆盖已存在的文件,因此将这些更改提交到版本控制系统中是安全的。将文件添加到版本控制系统的忽略列表意味着在克隆新仓库并安装依赖项时它们会被生成。

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

"extra": {
  "silktide/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是一个关联数组,包含您希望允许访问的路由。

在这种情况下,一个POST到/sub/directory的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数组将文件导入父文件中。

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

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

导入的文件在处理路由和组之前被合并成一个单独的配置数组。如果出现路由命名冲突,后导入的将覆盖前导入的,并且导入的文件将优先于任何导入的路由。

自定义模板

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

扩展库应该像 Lazy Boy 一样使用;作为一个 composer 依赖项引入到应用程序中。库本身应该像平常一样要求 Lazy Boy,然后向 composer.json 文件添加额外的数据来配置模板

{
  "name": "silktide/lazy-boy-extension",
  "require": {
    "lazy-boy": "^2.0.0"
  },
  "extra": {
    "silktide/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": {
  "silktide/lazy-boy": {
    "whiteListedPackages": [
      "your/package-name"
    ]
  }
}

贡献

如果您希望看到改进,请在此 github 项目中打开一个问题,或者更好的是,复制项目,实现您的更改并创建一个 pull request。

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

为什么是 "Lazy Boy"

因为当然它喜欢 REST :)