如何在CakePHP 4中扩展JSON视图以始终返回相同的模式

7xllpg7q  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(146)

如何在CakePHP 4中扩展JSON视图以始终返回相同的模式。
例如,在我的操作index()(端点API:GET /api/articles)我有:

$this->set(compact('data', 'paging'));
$this->set('_serialize', ['data', 'paging']);

但是,我很想总是有这样的结果:

{
    "status": "success",
    "error": [],
    "data": [
        ..
    ],
    "paging": [
        ..
    ]

因此,如何使每个响应都有像“status”或“error”这样带有默认值的键。

mutmk8jj

mutmk8jj1#

所以,解决方法很简单.每个API控制器都扩展了ApiController类的带体:

<?php
namespace App\Controller\Api;

use Cake\Controller\Controller;
use Cake\Event\EventInterface;

class ApiController extends Controller
{

    /**
     * @inheritDoc
     */
    public function initialize(): void
    {
        parent::initialize();

        $this->loadComponent('RequestHandler');

        $this->viewBuilder()->setClassName('Json');
    }

    /**
     * @inerhitDoc
     */
    public function beforeFilter(EventInterface $event)
    {
        parent::beforeFilter($event);

        $status = true;
        $error = '';

        $this->viewBuilder()->setVars(compact('status', 'error'));
    }

    /**
     * @inerhitDoc
     */
    public function beforeRender(EventInterface $event)
    {
        parent::beforeRender($event);

        $this->viewBuilder()->setVar('_serialize', array_keys($this->viewBuilder()->getVars()));
    }
}

如果我想在某个控制器中更改errorstatus,我可以这样做:

if ($data->isEmpty()) {
    $this->set([
        'status' => false,
        'error' => __d('api', 'No matching records!'),
    ]);
}

相关问题