berenger / adr-bundle
此包简化了在 Symfony 项目中设置 ADR 的过程。
3.1.3
2020-07-15 12:54 UTC
Requires
- php: >=7.2.0
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