danilovl / object-to-array-transform-bundle
Symfony 扩展包,通过配置字段将对象转换为数组。
v3.5.2
2024-03-30 07:52 UTC
Requires
- php: ^8.3
- danilovl/parameter-bundle: ^4.3.0
- symfony/framework-bundle: ^7.0
Requires (Dev)
- phpunit/phpunit: ^10.2
README
ObjectToArrayTransformBundle
关于
Symfony 扩展包,通过配置字段将对象转换为数组。
要求
- PHP 8.3 或更高版本
- Symfony 7.0 或更高版本
- ParameterBundle 4.3 或更高版本
1. 安装
使用 Composer 安装 danilovl/object-to-array-transform-bundle
包
composer require danilovl/object-to-array-transform-bundle
如果自动添加,则将 ObjectToArrayTransformBundle
添加到您的应用程序的包中
<?php // config/bundles.php return [ // ... Danilovl\ObjectToArrayTransformBundle\ObjectToArrayTransformBundle::class => ['all' => true] ];
2. 配置
每个对象必须声明一个在参数中定义的字段 get
方法。
在 parameters
中定义的每个字段必须与对象的名称匹配。
例如
Shop 实体。
<?php declare(strict_types=1); namespace App\Entity; use App\Entity\Traits\{ IdTrait, LocationTrait }; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Table(name="shop") * @ORM\Entity(repositoryClass="App\Entity\Repository\ShopRepository") */ class Shop { use IdTrait; use LocationTrait; /** * @ORM\Column(name="name", type="string", length=255, nullable=false) */ private ?string $name = null; /** * @ORM\ManyToOne(targetEntity="App\Entity\City", inversedBy="shops") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="id_city", referencedColumnName="id", nullable=false) * }) */ private ?City $city = null; public function getName(): ?string { return $this->name; } public function getCity(): ?City { return $this->city; } }
City 实体。
<?php declare(strict_types=1); namespace App\Entity; use App\Constant\TranslationConstant; use App\Entity\Traits\{ IdTrait, LocationTrait, TimestampAbleTrait }; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Table(name="city") * @ORM\Entity(repositoryClass="App\Entity\Repository\CityRepository") * @ORM\HasLifecycleCallbacks() */ class City { use IdTrait; use TimestampAbleTrait; use LocationTrait; /** * @ORM\Column(name="name", type="string", nullable=false) */ protected ?string $name = null; public function getName(): ?string { return $this->name; } }
Country 实体。
<?php declare(strict_types=1); namespace App\Entity; use App\Constant\TranslationConstant; use App\Entity\Traits\{ IdTrait, TimestampAbleTrait }; use Doctrine\Common\Collections\{ Collection, ArrayCollection }; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Table(name="country") * @ORM\Entity(repositoryClass="App\Entity\Repository\CountryRepository") * @ORM\HasLifecycleCallbacks() */ class Country { use IdTrait; use TimestampAbleTrait; /** * @ORM\Column(name="name", type="string", nullable=false) */ protected ?string $name = null; /** * @ORM\Column(name="code", type="string", nullable=false) */ protected ?string $code = null; /** * @ORM\OneToMany(targetEntity="App\Entity\City", mappedBy="country") */ protected Collection $cities; public function getName(): ?string { return $this->name; } public function getCode(): ?string { return $this->code; } public function getCities(): Collection { return $this->cities; } }
简单配置。
# config/services.yaml parameters: api_fields: default: Shop: fields: - id - name - city: City: fields: - id - name - latitude - longitude Country: fields: - id - name - code - cities
如果需要更改 cities
的 fields
。
您可以指定 DateTime
的格式。
# config/services.yaml parameters: api_fields: default: parameters: date_format: 'Y-m-d H:i:s' Shop: fields: - id - name - city - active: parameters: method: 'isActive' City: fields: - id - name - latitude - longitude Country: fields: - id - name - code - cities fields: - id - name - createdAt: parameters: format: 'Y-m-d'
2.1 使用
在控制器中转换对象。
<?php declare(strict_types=1); namespace App\Controller\Api; use Danilovl\ObjectToArrayTransformBundle\Interfaces\ObjectToArrayTransformServiceInterface; use Knp\Component\Pager\Pagination\PaginationInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class CountryController extends AbstractController { public function __construct(private ObjectToArrayTransformServiceInterface $objectToArrayTransformService) { } public function getMethod(): JsonResponse { $countries = $this->get('app.facade.country') ->getAll(); $result = []; foreach ($countries as $country) { $transformer = $this->objectToArrayTransformService->transform('api_fields.default', $country); $result[] = $transformer; } return new JsonResponse($result); } }
许可证
ObjectToArrayTransformBundle 是开源软件,根据MIT 许可证授权。