rrd108/cakephp-json-api-exception

CakePHP 的 JsonApiException 插件

1.0.0 2023-11-11 11:44 UTC

This package is auto-updated.

Last update: 2024-09-11 13:46:53 UTC


README

使您的 CakePHP 5 JSON REST API 错误响应更具描述性。

要支持 CakePHP 4,请使用 CakePHP 4 分支

如果您需要一个简单的解决方案来为 CakePHP JSON REST API 实现令牌身份验证,请查看此: CakePHP API Token Authenticator

安装

您可以使用 composer 将此插件安装到您的 CakePHP 应用程序中。

推荐的安装方法是

composer require rrd108/cakephp-json-api-exception

然后,要加载插件,可以运行以下命令

bin/cake plugin load JsonApiException

或者手动将以下行添加到您的应用 src/Application.php 文件中的 bootstrap() 函数中

$this->addPlugin('JsonApiException');

完成 :)

如何使用

假设您有一个 CakePHP JSON REST API,并且您想拥有更详细的消息和适当的响应代码。

// for example in /src/Controller/UsersController.php slightly change the baked add function
use JsonApiException\Error\Exception\JsonApiException;

public function add()
{
    $user = $this->Users->newEmptyEntity();
    if ($this->request->is('post')) {
        $user = $this->Users->patchEntity($user, $this->request->getData());
        if (!$this->Users->save($user)) {
            throw new JsonApiException($user, 'Save failed');
            // throw new JsonApiException($user, 'Save failed', 418);   // you can set the response's status code in the 3rd parameter
        }
    }
    $this->set(compact('user'));
    $this->viewBuilder()->setOption('serialize', ['user']);
}

如果保存失败,您将得到如下响应。

{
  "message": "Save failed",
  "url": "/users.json",
  "line": 12,
  "errorCount": 1,
  "errors": {
    "password": {
      "_required": "This field is required"
    }
  }
}

您也可以使用实体数组。

// for example in /src/Controller/UsersController.php slightly change the baked add function
use JsonApiException\Error\Exception\JsonApiException;

public function bulkAdd()
{
    $users = $this->Users->newEntities($this->request->getData());
    if (!$this->Users->saveMany($users)) {
        throw new JsonApiException($users, 'Errors in request data');
    }
    $this->set(compact('users'));
    $this->viewBuilder()->setOption('serialize', ['users']);
}

如果保存失败,您将得到如下响应。由于此时我们还没有实体的 id,错误消息中不能包含它。所以如果实体没有任何错误,errors 数组将包含一个空数组。因此,实体的数量将匹配错误条目的数量,实体 #3 的错误消息将是错误数组的第三个元素。

{
  "message": "Errors in request data",
  "url": "/users.json",
  "line": 12,
  "errorCount": 2,
  "errors": [
    {
      "name": {
        "_empty": "name is required"
      }
    },
    {
      "name": {
        "_empty": "name is required"
      }
    }
  ]
}