kif/doctrine_typescript_bundle

将 Doctrine 实体转换为 TypeScript 类

dev-master 2014-11-06 14:32 UTC

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 字段的设置器