philipphermes/transfer-bundle
最新稳定版本:1.4.0
Composer 安装命令:
composer require philipphermes/transfer-bundle
包简介
generates transfers from xml
关键字:
README 文档
README
A Symfony bundle for generating type-safe transfer objects (DTOs) from XML schema definitions. Supports OpenAPI attribute generation for API documentation.
Table of Contents
Installation
composer require philipphermes/transfer-bundle
Register the bundle in config/bundles.php:
return [ // ... PhilippHermes\TransferBundle\PhilippHermesTransferBundle::class => ['all' => true], ];
Configuration
Create config/packages/transfer.yaml to customize the bundle:
transfer: schema_dirs: - '%kernel.project_dir%/transfers' exclude_dirs: [] output_dir: '%kernel.project_dir%/src/Generated/Transfers' namespace: 'App\Generated\Transfers'
Configuration Options
| Option | Default | Description |
|---|---|---|
schema_dirs |
['%kernel.project_dir%/transfers'] |
Directories to scan for XML schema files (supports glob patterns) |
exclude_dirs |
[] |
Directories to exclude from scanning |
output_dir |
%kernel.project_dir%/src/Generated/Transfers |
Output directory for generated transfer classes |
namespace |
App\Generated\Transfers |
PHP namespace for generated classes |
Vendor-Level Discovery
To include transfers from vendor packages:
transfer: schema_dirs: - '%kernel.project_dir%/transfers' - '%kernel.project_dir%/vendor/*/*/transfers' exclude_dirs: - '%kernel.project_dir%/vendor/*/tests' - '%kernel.project_dir%/vendor/*/*/tests'
Usage
Defining Transfers
Create XML schema files in your configured schema directories (default: transfers/).
<?xml version="1.0" encoding="UTF-8"?> <transfers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/philipphermes/transfer-bundle/src/Resources/schema/transfer.xsd"> <transfer name="User"> <property name="email" type="string" description="The email of the user"/> <property name="password" type="string" description="The password of the user"/> <property name="addresses" type="Address[]" singular="address" isNullable="true"/> <property name="roles" type="string[]"/> </transfer> <transfer name="Address"> <property name="street" type="string"/> </transfer> </transfers>
Key features:
- Multiple XML files are supported and will be merged
- Transfers with the same name across files are combined
- First definition of a property takes precedence
Property Attributes
| Attribute | Required | Description |
|---|---|---|
name |
Yes | Property name |
type |
Yes | PHP type (string, int, bool, float, array, Transfer, Transfer[]) |
description |
No | Property description (used in OpenAPI docs) |
singular |
No | Singular name for array properties (enables addX() method) |
isNullable |
No | Whether the property can be null (true/false) |
Generating Transfers
Run the generator command:
php bin/console transfer:generate
Options:
--clean-disable- Skip cleaning the output directory before generation
OpenAPI Integration
Add api="true" to transfers to automatically generate OpenAPI attributes.
Transfer Attributes
| Attribute | Required | Description |
|---|---|---|
name |
Yes | Transfer name (generates {name}Transfer class) |
api |
No | Set to true to generate OpenAPI attributes |
apiAlias |
No | Custom name for OpenAPI documentation (default: transfer name without "Transfer" suffix) |
Example
<transfer name="User" api="true" apiAlias="UserResource"> <property name="email" type="string" description="The email of the user"/> <property name="password" type="string" description="The password of the user"/> </transfer> <transfer name="Error" api="true"> <property name="status" type="int"/> <property name="message" type="string"/> </transfer>
Use in your controllers with NelmioApiDocBundle:
use App\Generated\Transfers\UserTransfer; use App\Generated\Transfers\ErrorTransfer; use Nelmio\ApiDocBundle\Annotation\Model; use OpenApi\Attributes as OA; class UserApiController extends AbstractController { #[OA\Tag(name: 'user')] #[OA\Response( response: 200, description: 'Returns a user by id', content: new Model(type: UserTransfer::class) )] #[OA\Response( response: 404, description: 'User not found', content: new Model(type: ErrorTransfer::class) )] #[Route('/api/user/{id}', methods: ['GET'])] public function getUserById(int $id): Response { // ... } }
Note
Child transfers do not inherit api="true" - you must set it explicitly on each transfer.
Development
Static Analysis
vendor/bin/phpstan analyse --memory-limit=1G
Testing
vendor/bin/phpunit
With coverage report:
XDEBUG_MODE=coverage vendor/bin/phpunit --coverage-html coverage-report
统计信息
- 总下载量: 143
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 2
- 点击次数: 0
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2025-04-14