kif / doctrine_typescript_bundle
将 Doctrine 实体转换为 TypeScript 类
Requires
- php: >=5.5.0
- symfony/symfony: ~2.3
Requires (Dev)
- jms/serializer-bundle: 0.13.*@dev
- mikey179/vfsstream: 1.4.*@dev
This package is not auto-updated.
Last update: 2020-01-06 08:59:44 UTC
README
## 主要概念
这是一个命令行工具,用于将 Doctrine 实体转换为 Typescript 语言文件。TypeScript 是 JavaScript 的类型超集,编译为纯 JavaScript,并大量使用面向对象术语和结构。
一个典型场景是,如果您有一个基于 TypeScript/JavaScript 的前端和一个基于 symfony/php 的后端,并且希望在两者之间有一个统一的 DTO/MODEL 表示。因此,如果您使用 doctrine 结构化某些内容,则希望在项目的 JavaScript 部分自动生成,而不需要编写代码。
## 安装
$ php composer.phar require kif/doctrine_typescript_bundle 'dev-master'
- 在您的
app/AppKernel.php
文件中激活包
<?php // app/AppKernel.php public function registerBundles() { $bundles = array( // ... new Kif\DoctrineToTypescriptBundle\KifDoctrineToTypescriptBundle(), ); }
## 使用方法
### 标准使用方法
- 在您的 symfony 文件夹中使用以下命令
$ php app/console kif:doctrine:typescript:generate destination_folder
destination_folder
必须是可写文件夹。
这将在目标文件夹中生成一个 /models/
文件夹,其中包含所有作为 doctrine 实体表示的 symfony 项目中的模型
让我们假设在我们的项目中有一个 Doctrine 实体
<?php // src/Acme/UserBundle/Entity/Contact.php namespace Acme\UserBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="contacts") */ class Contact { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @var string * * @ORM\Column(name="nick_name", type="string", length=255, nullable=true) */ private $nickName; }
现在如果我们运行以下命令
$ php app/console kif:doctrine:typescript:generate src/typscript
我们将找到以下文件被生成
$ src/typscript/models/AcmeUserBundleEntity/Contact.ts
内容如下
module AcmeUserBundleEntity { export class Contact { private _id:number ; get id(){ return this._id; } set id(_id:number){ this._id=_id; } private _nickName:string ; get nickName(){ return this._nickName; } set nickName(_nickName:string){ this._nickName=_nickName; }
现在您可以在 TypeScript 代码中轻松访问生成的模型
///<reference path="models/AcmeUserBundleEntity/Contact"/> var contact = new AcmeUserBundleEntity.Contact(); contact.nickName = "myNickname"; alert(contact.nickName);
### 使用 --exposed-only
选项
重要:为了正确工作,您需要正确安装 JMS Serializer Bundle。
有些情况下,您只想生成由 JMS serializer 暴露的实体和字段,因为您希望将其他部分保持为私有或隐藏。
让我们回顾一下之前的 doctrine 实体。
<?php // src/Acme/UserBundle/Entity/Contact.php //... use JMS\Serializer\Annotation\ExclusionPolicy; use JMS\Serializer\Annotation\Expose; * @ORM\Table(name="contacts") * @ExclusionPolicy("all") */ class Contact { //... /** * @Expose */ private $nickName; }
注意注解 @ExclusionPolicy("all")
排除了所有字段,注解 @Expose
直接位于字段 $nickName
上。这将生成以下 TypeScript 文件。
module AcmeUserBundleEntity { private _nickName:string ; get nickName(){ return this._nickName; } set nickName(_nickName:string){ this._nickName=_nickName; }
注意只有字段 $nickName
被生成,而其他部分被忽略。(隐藏)
请注意,只有设置 @ExclusionPolicy
为(无或全部)的实体才会生成。因此,没有此注解的实体将自动识别为 @ExclusionPolicy(all)
并被生成器完全忽略
## 待办事项
- 设置一个
--single-file
选项,将所有模型生成在单个 .ts/js 文件中。这应该停止包到文件夹的机制。生成的文件名将是 "models.ts"。 - 使用
--exposed-only
选项时,能够禁用@readOnly
字段的设置器