andrej-griniuk/cakephp-fractal-transformer-view

利用Fractal库进行实体转换的CakePHP视图构建器

3.0 2023-12-11 04:47 UTC

This package is auto-updated.

Last update: 2024-09-11 06:36:18 UTC


README

Build Status codecov License

FractalTransformerView插件用于CakePHP

此插件是对JsonView的一个薄包装,允许使用Fractal转换器来处理您的API输出。什么是Fractal

Fractal为复杂的数据输出提供了表示和转换层,如RESTful API中的输出,与JSON配合得非常好。将其视为JSON/YAML等数据的视图层。在构建API时,人们通常会直接从数据库中抓取数据并传递给json_encode()。这可能在“简单”API中可行,但如果它们被公众使用或被移动应用程序使用,这会导致输出不一致。

要求

  • CakePHP 5.x(使用~1.0用于CakePHP 3.x,~2.0用于CakePHP 4.x)

安装

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

composer require andrej-griniuk/cakephp-fractal-transformer-view

使用

要启用此插件,将FractalTransformerView.FractalTransformer类名称设置为viewBuilder。然后您只需像通常在您的数据视图中那样做 - 通过设置serialize视图构建器选项来指定您想要序列化的视图变量。例如:

namespace App\Controller;

class ArticlesController extends AppController
{
    public function initialize(): void
    {
        parent::initialize();
        
        $this->loadComponent('RequestHandler');
        
        $this->viewBuilder()->setClassName('FractalTransformerView.FractalTransformer');
    }

    public function index()
    {
        // Set the view vars that have to be serialized.
        $this->set('articles', $this->paginate());
        // Specify which view vars JsonView should serialize.
        $this->viewBuilder()->setOption('serialize', ['articles']);
    }
}

视图将查找以实体名称开头的转换器类。例如:

namespace App\Model\Transformer;

use App\Model\Entity\Article;
use League\Fractal\TransformerAbstract;

class ArticleTransformer extends TransformerAbstract
{
    /**
     * Creates a response item for each instance
     *
     * @param Article $article post entity
     * @return array transformed post
     */
    public function transform(Article $article)
    {
        return [
            'title' => $article->get('title')
        ];
    }
}

如果找不到转换器类,变量将按常规方式进行序列化。

可以通过定义transformer视图构建器选项来设置自定义转换器类名称

$this->viewBuilder()->setOption('transform', ['articles' => '\App\Model\Transformer\CustomArticleTransformer']);

您还可以定义不希望对某些变量使用转换器

$this->viewBuilder()->setOption('transform', ['articles' => false]);

您可以通过serializer视图构建器选项设置自定义序列化器(类名称或对象)

$this->viewBuilder()->setOption('serializer', new CustomSerializer());

制作转换器

要制作转换器,您必须在您的src/Application.php文件中包含此插件。在您的引导方法中添加以下内容:

$this->addPlugin('FractalTransformerView');

您还必须安装cakephp/bake Composer包。

现在,您可以通过运行bin/cake bake transformer YOUR_MODEL来创建转换器。

错误与反馈

https://github.com/andrej-griniuk/cakephp-fractal-transformer-view/issues

致谢

受@josegonzalez 使用Fractal对实体进行转换以创建自定义API端点的启发。

许可协议

版权所有 (c) 2016, Andrej Griniuk,并许可于MIT许可协议