jinn/laravel

Jinn for Laravel。模型、迁移和API生成器。

v0.2.1 2022-03-15 09:38 UTC

This package is auto-updated.

Last update: 2024-09-30 01:57:31 UTC


README

Jinn是一个代码生成器,通过从简单的YAML定义生成模型、迁移和API来加速您的工作。与其他生成器不同的是,Jinn允许您在不失去更新定义时更新生成代码的能力。

请阅读完整的文档jinncode.dev

关键概念

当然,有大量的框架和库使用不同的方法实现了相同的目的。本节描述了使Jinn与众不同的关键设计决策。

代码生成

与许多API和管理面板框架不同,Jinn使用代码生成,因为它提供了以下好处:

  • 仅生成所需的代码,即如果您不需要API中的update方法,则根本不会生成。
  • 生成的代码不必非常通用,这使得它更加简单。

Symfony和Laravel框架也使用代码生成。然而,它们采用缓存方法,即在实际运行时生成代码。Jinn在构建时生成代码,这意味着没有首次运行性能缺点,并且可以轻松检查代码。

所有上述内容意味着:

  • Jinn与其他方法相比没有性能缺点。
  • 检查代码、了解其工作原理、扩展和自定义它都很容易。

基础类

Jinn生成的每个类(除迁移外)都被分为两个文件

  1. 在您的源文件夹下有一个空的类,它扩展了一个
  2. 位于单独文件夹中的基类,该文件夹包含所有逻辑

这个想法是从过去知名的PHP ORM Propel中借用的。主类只生成一次且永不更新,因此您可以自由地使用它来定制生成的逻辑。同时,Jinn可以在定义更改时为您更新基类逻辑。

数据库

目前,Jinn仅支持SQL数据库。计划支持MongoDB。

Jinn旨在管理其数据库表和模型,即它无法与现有的模型和数据库表一起工作。它还期望不会对其数据库表进行更改;否则,它们可能会被覆盖。同时,同一数据库中可以同时存在Jinn管理的和非Jinn管理的表。

框架

Jinn的参考实现是为Laravel制作的,但它旨在允许为任何框架实现。欢迎贡献者。

在下面的指南中,特定于Laravel的部分将相应地标记。

安装

通过Composer设置

composer require jinn/jinn-laravel@dev-master

发布Jinn配置文件

php artisan vendor:publish --provider="Jinn\Laravel\JinnServiceProvider"

创建Jinn文件夹结构

默认结构

jinn 
- def
- gen 

可以通过config/jinn.php配置替代结构。此外,本指南将使用默认配置。更改Jinn配置应导致后续步骤的相应更改。

配置自动加载

编辑composer.json,找到自动加载部分,并添加以下行

"autoload": {
    "psr-4": {
        ...
        "JinnGenerated\\": "jinn/gen/" 
    }
}

然后让Composer更新自动加载文件

composer dump-autoload

入门指南

基本定义

将以下定义复制到jinn/def/entities.yaml或创建自己的。

User:
  class:
    extends: Illuminate\Foundation\Auth\User
  properties:
    name: string
    email: { type: string, unique: true }
    password: string
    avatar_filename: { type: string, required: false }

Post:
  properties:
    content: text
    author: { entity: User, relation: many-to-one }
    published_at: datetime
    comments: { entity: Comment, relation: one-to-many }

Comment:
  properties:
    content: text
    author: { entity: User, relation: many-to-one }
    published_at: datetime

生成

要求Jinn生成文件

php artisan jinn

检查appjinn/gen文件夹下生成的文件。

待办事项

  • 模型
    • 更多的字段类型?
    • 不同类型的id
    • 允许创建必要的(非可空)多对一关系
  • API
    • 相关控制器
    • 其他方法:关联/解除关联,其他?
    • 规范
  • 迁移
    • MongoDB
  • 管理面板
  • 文件监视器
  • Symfony 实现