berenger/adr-bundle

此包简化了在 Symfony 项目中设置 ADR 的过程。

安装: 36

依赖: 0

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

3.1.3 2020-07-15 12:54 UTC

This package is auto-updated.

Last update: 2024-09-15 22:12:02 UTC


README

动作域响应器(ADR)是一种软件架构模式,由 Paul M. Jones[1] 提出,是对模型-视图-控制器(MVC)的改进,更适合 Web 应用程序。ADR 的设计目的是比 MVC 更好地匹配 HTTP 通信的请求-响应流程,而 MVC 最初是为桌面软件应用程序设计的。

来自 维基百科

此包简化了在 Symfony 5.0 项目中设置 ADR 的过程。

版本

  • 1.x 版本(稳定版本):推荐所有使用 Symfony 3.4 的项目。
  • 2.x 版本(稳定版本):推荐所有使用 Symfony 4.4 的项目。
  • 3.x 版本(稳定版本):推荐所有使用 Symfony 5.0 或更高版本的项目。

先决条件

  • PHP:至少版本 7.2
  • Symfony:至少版本 5.0

安装

将包添加到您的项目

  composer require berenger/adr-bundle:^3.0

添加 Cor 标识符

在响应头中使用:Access-Control-Allow-Origin

更新文件:config/service.yaml

parameters:
  ...
  cors: "https://url.service"
  ...

将包添加到配置

更新文件:config/bundles.php

<?php

return [
    ...
    AdrBundle\AdrBundle::class => ['all' => true],
    ...
];

Symfony:默认情况下,服务是私有的

更新文件:config/service.yaml

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: true

使用

路由

post:
  path: /posts/{id}
  controller: App\Controller\ViewPostAction
  methods: ["GET"]
  defaults:
    responder: App\Responder\ViewPostResponder

动作(控制器)

动作必须返回一个关联数组,该数组将传递给响应器的 __invoke 方法。数组的每个键都必须匹配响应器 __invoke 方法签名的参数,否则将抛出异常。数组中参数的顺序不重要。

<?php

namespace App\Controller;

use App\Entity\Post;
use Doctrine\ORM\EntityNotFoundException;

class ViewPostAction
{
    public function __invoke(int $id)
    {
        $postRepository = $this->getDoctrine()->getRepository(Post::class);
        $post = $postRepository->findOneById($id);

        if (!$post) {
            throw new EntityNotFoundException('Post not found');
        }

        return [
            'post' => $post,
        ];
    }
}

响应器

响应器可以是

  • 直接返回 Symfony\Component\HttpFoundation\Response 实例(例如,当您返回包含使用 Twig 生成的 HTML 的响应时)
  • 要序列化到响应中的数据数组(通常是您正在构建返回 JSON 或 XML 的 API 时的情形)。在这种情况下,您可以指定序列化组。
<?php

namespace App\Responder;


use App\Entity\Post;

class ViewPostResponder
{
    /**
     * @param Post $post
     * @return array
     */
    public function __invoke(Post $post)
    {
        return [
            'data' => [
                'post' => $post,
            ],
            'serialization_groups' => 'view',
        ];
    }
}

实体示例

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;

class Post
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer", options={"unsigned"=true})
     * @Groups({"always"})
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups({"list","view"})
     */
    private $title;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups({"view"})
     */
    private $content;

    ...
}

API 返回 XML 或 JSON 格式的数据

JSON 返回的头部(默认)

accept:application/json

XML 返回的头部

accept:application/xml