dogancelik/slim-json

Slim PHP框架的JSON中间件

v0.4.0 2015-09-15 22:55 UTC

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_errorjson.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"}

请注意,您都拥有fooerror键。这是因为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()]);
});