dogancelik / slim-json
Slim PHP框架的JSON中间件
Requires
- php: >=5.3.0
This package is not auto-updated.
Last update: 2024-09-24 02:32:32 UTC
README
SlimJson 是一个易于使用且功能强大的 Slim PHP 框架 JSON 中间件。SlimJson 帮助您编写返回 JSON 输出的 Web 应用程序。
如何安装
您可以使用 Composer 安装 SlimJson:
composer require dogancelik/slim-json
或者将此行添加到您的 composer.json
文件中
"dogancelik/slim-json": "dev-master"
如何使用
require 'vendor/autoload.php'; $app = new \Slim\Slim(); // Add the middleware globally $app->add(new \SlimJson\Middleware(array( 'json.status' => true, 'json.override_error' => true, 'json.override_notfound' => true ))); $app->get('/', function() use ($app) { $app->render(200, ['Hello' => 'World']); }); $app->get('/error', function() use ($app) { throw new \Exception('This is an error'); }); $app->run();
如果您访问 localhost/
,您将得到: {"Hello": "World", "_status": 200}
如果您访问 localhost/error
: {"error": "This is an error", "_status": 500}
如果您访问 localhost/notfound
: {"error": "'/notfound' is not found.", "_status": 404}
渲染JSON
如果您还没有注意到,我没有给我们的 Slim 应用程序添加 JSON 视图。这是因为当我们添加中间件时,我们会为您添加 JSON 视图,所以您不需要这样做。
您应该看到我们在这里使用了一个不同的 $app->render()
方法。
渲染参数如下: function render(status, data)
status
是 HTTP 返回代码 整数 或 字符串。data
是一个 数组。
配置
您可以使用这些配置选项初始化中间件。
示例
$app->add(new \SlimJson\Middleware([ 'json.override_error' => true, 'json.debug' => true, 'json.status' => true, ]));
所有选项默认都是禁用状态 (false)。将其设置为 true 以启用。
json.override_error
配置 $app->error
以返回带有 HTTP 返回代码 500
的 JSON 响应。 仅当您全局添加中间件时才有效
json.override_notfound
配置 $app->notFound
以返回带有 HTTP 返回代码 404
的 JSON 响应。 仅当您全局添加中间件时才有效
json.protect
将 while(1);
添加到每个 JSON 响应中。 这是什么?
json.status
将一个整数 _status
字段添加到您的 JSON 响应中。
json.debug
如果您启用此选项,SlimJson 将在 error
上添加额外的调试信息(命名为 _debug
)。 Exception
属性(如消息、堆栈跟踪、行等)将添加到 JSON 响应中。
json.cors
启用 CORS。
如果将其设置为 true
,则将 CORS 设置为 *
(允许所有域)。如果设置为一个字符串,则将 CORS 设置为该字符串
json.clear_data
如果您没有使用全局中间件,则应该阅读此选项。了解为什么我添加了这个选项。
json.json_encode_options
将一个 $options
参数传递给 json_encode
。
请访问 PHP.net 页面以获取可用于 json_encode 的可用常量。
高级
为单个路由使用 SlimJson
如果您不需要整个应用程序的 JSON,并希望为单个路由返回 JSON
而不是全局添加中间件,请将 $app->add
放入您想要的路由器中
$app->get('/', function() use ($app) { $app->add(new \SlimJson\Middleware([ 'json.status' => true ])); $app->render(200, ['Hello' => 'World']); });
使用 inject() 以获得便捷和快乐 😄
我在中间件下创建了一个静态方法,称为 inject($app, $config)
,它基本上与调用 $app->add();
相同,但适用于编写更干净、更简短的代码。 传递 $app
和 $config
参数是可选的。
替换这个
$app->add(new \SlimJson\Middleware([ 'json.status' => true ]));
为这个
\SlimJson\Middleware::inject([ 'json.status' => true ]));
设置您自己的 $app->error
或 $app->notFound
信息
如果您全局添加中间件并启用 json.override_error
或 json.override_notfound
,SlimJson 将为每个处理程序使用自己的消息格式。但您也可以更改它!
使用配置
$app = new \Slim\Slim(); $app->add(new \SlimJson\Middleware([ 'json.override_notfound' => function($request) { return 'We can\'t find this page: ' . $request->getPath(); }, ]));
使用中间件方法
$app = new \Slim\Slim(); $slimjson = new \SlimJson\Middleware(); // use `setNotFoundMessage` for `$app->notFound` message $slimjson->setErrorMessage(function($exception) { return 'Custom error message: ' . $exception->getMessage(); }); $app->add($slimjson);
边缘情况选项:json.clear_data
如果您没有全局使用中间件,请阅读此选项。您可能会遇到此错误。
假设您有一个GET路由器(/foobar
)和一个错误处理器
$app->get('/foobar', function() use ($app) { \SlimJson\Middleware::inject(); $app->render(200, ['foo' => 'bar']); }); $app->error(function (\Exception $e) use ($app) { \SlimJson\Middleware::inject(); $app->render(500, ['error' => $e->getMessage()]); });
如果您从GET路由器中移除inject()
会发生什么?那么它将像这样
$app->get('/foobar', function() use ($app) { $app->render(200, ['foo' => 'bar']); });
然后,如果您访问/foobar
,您将得到如下错误
{"foo" => "bar", "error" => "View cannot render 200 because the template does not exist"}
请注意,您都拥有foo
和error
键。这是因为Slim使用了$app->view->appendData()
。
为什么会这样发生?因为我们忘记在GET路由器中添加\SlimJson\Middleware::inject();
;所以别忘了添加这个。
如果您启用此选项,它将删除所有data
。它可能删除其他中间件的data(如Flash(Session)中间件),但我还没有测试。
但如果您确实想使用它,那么请将inject(array('json_clear_data' => true))
添加到您的错误处理器
$app->error(function (\Exception $e) use ($app) { \SlimJson\Middleware::inject(array( 'json.clear_data' => true )); $app->render(500, ['error' => $e->getMessage()]); });