aariow / artisan-api
通过 REST API 和 HTTP 请求安全执行 Laravel Artisan 命令。
Requires
- php: ^8.0.2
- illuminate/collections: ^9.21
- illuminate/console: ^9.21
- illuminate/http: ^9.21
- illuminate/routing: ^9.21
- illuminate/support: ^9.21
Requires (Dev)
- orchestra/testbench: ^7.6
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-26 10:46:30 UTC
README
Artisan Api
通过 HTTP 执行 Artisan 命令
有时候你可能想执行 Artisan 命令,但没有访问 shell 或 SSH。这里我们为你带来了 REST API 解决方案。
你可以通过 REST API 轻松运行 Artisan 命令。
'README.md 需要更新'
目录
入门
要使用此包,您应该将其与 Laravel v9.21 和 PHP v8.0 或更高版本一起安装。
您可以通过 Composer 包管理器 安装它
composer require aariow/artisan-api --dev
尽管 Artisan-Api 本身具有生产检测器,但您也可以将其全局安装。
端点
正如其名所示,所有命令都可通过 HTTP 的 POST 方法访问。所有命令都将作为路由生成并集成到 Laravel 路由系统中。您只需要发送一个 POST 请求并遵循签名,就像其他 REST API 端点一样。
有两种类型的命令;一种是正常命令,如 php artisan list
或 php artisan cache:clear
,另一种是 GeneratorCommands
,它们倾向于在您的应用程序中创建文件,如 make:model
和 make:migration
。这些命令有不同的目的,您应该遵循不同的约定。
GeneratorCommand
是Illuminate\Console\GeneratorCommand
的实例,它扩展了Illuminate\Console\Command
类。
默认存在的所有命令或您创建的命令都将自动发现,您无需手动操作。因此,它们的端点将动态生成到您的应用程序中。因此,如果您删除/添加任何命令类,无需担心。
路由
让我们深入了解使用端点
路由的生成格式如下
https://domain.com/artisan/api/{command}/{subcommand}?args=key1:value1,key2:value2&options=opt1:value1,opt2
因此,上述端点将转换为
php artisan command:subcommand value1 value2 --opt1=value1 --opt2
对于 Generator 命令,端点是
https://domain.com/artisan/api/{command}/{subcommand}/{name}?args=key1:value1,key2:value2&options=opt1:value1,opt2
请注意,有一个 name
变量。由于所有 Generator 命令都需要一个名为 name
的参数,因此需要指定您想要的内容。
命令示例
php artisan list
将转换为
https://domain.com/artisan/api/list
和这个
php artisan cache:forget myCachedKeyName
将转换为
https://domain.com/artisan/api/cache/forget?args=key:myCachedKeyName
另一个
php artisan optimize:clear -v
将转换为
https://domain.com/artisan/api/optimize/clear?options=v
一个 Generator 命令
php artisan make:model MyModel --controller -f
将转换为
https://domain.com/artisan/api/make/model/MyModel?options=controller,f
具有一个以上字符的选项将转换为
--option
。
响应
调用端点后,您将收到一个 `` 响应。
成功
当一切正常时: status : 200 OK
{ "ok": true, "status": 200, "output": "Output of the command, given by Artisan" }
未找到
当输入的命令未被应用程序找到时: status : 404 Not Found
{ "ok": false, "status": 404, "output": "Command 'command:subcommand' is not defined." }
无效的参数格式
当参数以无效格式给出时: status : 500 Server Error
{ "ok": false, "status": 500, "output": "Argument(s) 'key:value' given by an invalid format." }
无效的选项格式
当选项以无效格式给出时: status : 500 Server Error
{ "ok": false, "status": 500, "output": "Options(s) 'key:value' given by an invalid format." }
禁止路由
您可能希望限制对某些关键命令(如 db:seed
)的访问。 Artisan-Api 已经想到了这一点,并使这些命令对客户端不可访问。要指定禁止的命令,您被鼓励在 config/artisan.php
文件中添加它们。
return [ ..., 'forbidden-routes' => [ 'clear-compiled', 'tinker', 'up', 'down', 'serve', 'completion', '_complete', 'db*', // all `db:seed` and `db:wipe` will be inaccessible '*publish' // like `vendor:publish` ] ];
当客户端想要通过端点访问这些命令时,它将收到一个 404 NOT_FOUND
HTTP 响应。
身份验证
所有端点都将生成在Laravel的api
中间件下,并受到内置的认证系统保护,主要使用Sanctum
和API令牌。
配置
如前所述,存在一个配置文件config/artisan.php
。您可以自由修改所需的值。
API 前缀和 HTTP 方法
在此,您可以更改默认的API前缀并按需自定义。此外,您可以使用您设置的任何HTTP方法访问端点。
return [ ... 'api' => [ 'prefix' => "/artisan/api", 'method' => 'POST', // or ['POST', 'PUT'] ], ... ];
自动运行
由于某些原因,尤其是在生产模式下,您可能不希望允许通过HTTP请求执行命令。为了防止这种行为,将auto-run
设置为false
return [ ... 'auto-run' => false, ... ];
这防止默认加载包的ArtisanApiServiceProvider
服务提供者。
安全性
Artisan-Api已尽最大努力保护RCE漏洞和其他可能的逻辑错误。
Artisan-Api在内部使用
Symfony/console
,所有命令的执行都由它过滤和识别。没有直接调用shell_exec()
或exec()
函数。
IP限制
您可以直接允许任意多的IP访问您的命令。 '*'
表示所有IP都受信任。
中间件
Artisan-Api中有两个中间件。
CheckEnvMode
中间件用于在生产环境中终止请求。
AbortForbiddenRoute
中间件用于在访问受禁路由时抛出404 NOT_FOUND
状态码。
有用提示
;)
待办事项
- 最好将查询字符串中的
args
和options
转换为数组。- 例如:
?arg[key1]=value1&arg[key2]=value2
(这是处理查询字符串值的一种更标准的方式)
- 例如:
- 实现一种处理交互式命令(如
tinker
)的方式(可能可以通过套接字实现) - 使响应对用户更易读,(移除"\n",...)