lexide / lazy-boy
一个使用Silex和Syringe以及支持Puzzle-DI的REST API应用程序框架
Requires
- php: >=7.3.0
- composer-plugin-api: ^1.0 || ^2.0
- lexide/syringe: ~2.2.0
- silex/silex: ^2.0
Requires (Dev)
- composer/composer: 2.0.*@dev
- mikey179/vfsstream: ^1.4.0
- mockery/mockery: ^1.4.0
- phpunit/phpunit: ^9.0.0
Suggests
- lexide/puzzle-di: Allow installed modules to set up dependency injection for their components
- symfony/console: Run CLI commands
This package is auto-updated.
Last update: 2024-09-23 16:18:44 UTC
README
Lazy Boy将创建一个Silex框架的骨架,这样您就可以在不编写样板代码的情况下创建REST API。
摘要
Lazy Boy将创建一个Silex框架的骨架,以便您可以在不编写样板代码的情况下创建REST API。
它包含路由加载器并使用Syringe,允许您在配置文件中定义路由和服务,而不是在PHP中
如果您已安装Symfony console,它还将创建一个控制台脚本,并自动加载服务容器中找到的任何命令(任何以".command"结尾且是Symfony Command类实例的服务名称)。您还可以使用Puzzle-DI从模块中加载服务配置。
要求
- Silex 2.0+
安装
使用composer安装
composer require Lexide/lazy-boy:^2.0
每次运行composer update
或composer 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
。
对于每个路由,url
和action
参数是必需的,但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 方法为最常用的方法集:GET
、POST
、PATCH
、PUT
和 DELETE
。这可以通过更改 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 允许的更受限制的列表。在上面的示例中,仅允许 GET
、POST
和 PUT
方法进行 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 兼容,因此应避免使用生成器、finally
、empty(someFunction())
等等。
为什么叫 "Lazy Boy"?
因为它喜欢 REST,当然 :)