[扩展推荐] Laravel Shift 推出的代码生成器 Blueprint

Laravel

Blueprint 是一个可以从单一的人类可读的定义中快速的创建多个Laravel组件的开源工具。https://github.com/laravel-shift/blueprint

需求

Blueprint需要Laravel6.0及以上版本。

然而Blueprint在将来的版本中会更加灵活, 它当前假设标准的项目结构使用App命名空间。

基本使用

Blueprint 添加一个artisan命令。

php artisan blueprint:build [draft]

draft文件包含用来创建组件的定义.。默认情况下, blueprint:build命令尝试从项目的根目录下面下加载draft.yaml文件。

组件的定义

你可以使用 Blueprint 的 artisan 命令在 draft 文件中生成多个Laravel组件。

Within this draft file you define models and controllers using an expressive, human-readable YAML syntax.

让我们看看下面的草稿文件:

models:
  Post:
    title: string:400
    content: longtext
    published_at: nullable timestamp

controllers:
  Post:
    index:
      query: all
      render: post.index with:posts

    store:
      validate: title, content
      save: post
      send: ReviewNotification to:post.author with:post
      dispatch: SyncMedia with:post
      fire: NewPost with:post
      flash: post.title
      redirect: post.index

从YAML的这20条简单代码行中,Blueprint将生成以下所有Laravel组件:

  • 用于Postmodel 类,该类具有 可填充castsdates属性以及关系方法。
  • migration 创建 posts 表。
  • factory智能设置带有伪数据的列。
  • 用于 PostController controller 类,具有indexstore操作,并为每个[语句] 生成了代码(https://github.com/laravel -shift / blueprint#statements)。
  • 用于PostController操作的 Routes
  • form request StorePostRequest 验证 titlecontent 基于  post 模型定义。
  • 用于 ReviewNotification mailable 类,其中包含通过 constructor 设置的post属性。
  • SyncMedia job 类,其中包含通过构造函数设置的post 属性。
  • 用于 NewPost event 类,其中包含通过 构造函数 设置的 post 属性。
  • PostController @ index渲染的post / index.blade.php刀片模板

虽然此草稿文件仅定义了一个模型和控制器,但是您可以定义多个模型和控制器。

模型

在draft文件的模型部分中,您可以定义多个模型。每个模型都以名称开头,后面是列的列表。列是键:值对,其中key是列名,而value定义其属性。

扩展上面的示例,此draft文件定义了多个模型:

models:
  Post:
    title: string:400
    content: longtext
    published_at: nullable timestamp

  Comment:
    content: longtext
    published_at: nullable timestamp

  # additional models...

根据此定义,Blueprint创建两个模型:分别为PostComment。您可以继续定义其他模型。

Blueprint建议以其 StudlyCase 定义单数形式的模型名称,以遵循Laravel命名约定。例如,Post而不是postposts

同样,列名将按原样使用。这些列的属性可以是[列类型列修饰符。您可以按原样或使用小写字母定义它们。

对于复杂的属性,您可以使用key:value对。在上面的示例中,string:400定义了一个string列类型,最大长度为400个字符。其他示例包括enum:'foo','bar','baz'decimal:10,2

默认情况下,将自动为每个模型定义一个id timestamps 列。要禁用这些列,您可以使用false值定义它们。例如,timestamps:false

Blueprint还提供了其他速记形式,它们将扩展为有效的YAML。速记包括id数据类型,以及定义软删除模型。

例如:

models:
  Comment:
    user_id: id
    softDeletes
    # ...

使用这些速记,Blueprint将使用SoftDeletestrait生成一个Comment类。它还将为整数外键创建一个具有适当数据类型的user_id列。

Blueprint还检查列并将其分配给fillablecastsdates属性,并生成关系方法。

默认情况下,除id timestamps 外的所有列都将添加到fillable属性中。

在适当的情况下,Blueprint 将会 转换 列为integerboolean, and decimal 类型.。任何 date 列都将添加到dates属性中。

使用id作为列名的列或以_id结尾的列将用于生成belongsTo关系。默认情况下,Blueprint使用相关模型的列名前缀。如果为其他模型定义关系,则可以使用id:model语法。

例如:

models:
  Post:
    author_id: id:user
    # ...

控制器

模型类似,您也可以定义多个控制器。在controllers部分中,按名称定义 controller 。每个控制器可以定义多个操作,其中包含语句列表。

在上面的示例中展开,此draft文件定义了多个控制器:

controllers:
  Post:
    index:
      query: all
      render: post.index with:posts
    create:
      render: post.create
    store:
      validate: title, content
      save: post
      redirect: post.index

  Comment:
    show:
      render: comment.show with:show

  # additional controller...

根据此定义,Blueprint将生成两个控制器。具有indexcreatestore操作的PostController。还有一个具有show操作CommentController

虽然您可以指定控制器的全名,但Blueprint会自动在名称后缀Controller

Blueprint鼓励您定义资源控制器。这样做可以使Blueprint推断细节并自动生成更多代码。

语句

Blueprint带有一组表达性语句,这些语句隐式定义了要生成的其他组件。每个语句都是一个键:值对。

定义了要生成的语句的类型。目前,Blueprint支持以下类型的语句:

validate

根据引用的模型定义生成带有规则的表单请求。Blueprint接受,其中包含用逗号分隔的列名列表。

例如:

validate: title, content, author_id

Blueprint还更新了注入的请求对象的类型提示。

find

生成Eloquent的find语句。如果提供的是合格的参考,Blueprint将扩展参考以确定模型。否则,Blueprint将尝试使用控制器来确定相关模型。

query

使用value中提供的key:value对生成Eloquent查询语句。键可以是where子句和[ordering](https://laravel.com / docs / queries#ordering-grouping-limit-and-offset)。

例如:

query: where:title where:content order:published_at limit:5

目前,Blueprint支持为allgetpluckcount生成查询语句。

save/delete

生成用于保存模型的Eloquent语句。Blueprint使用控制器操作来推断要生成的语句。

例如,对于一个store控制器操作,Blueprint将生成一个Model :: create()语句。否则,将生成一个$ model-> save()语句。

同样,在destroy控制器动作中,Blueprint将生成一个$ model-> delete()语句。否则将生成Model :: destroy()语句。

flash

生成一个[flash data]连接到会话的语句。Blueprint将使用value作为session的key,并将引用扩展为session的value。

例如:

flash: post.title

render

生成return view();语句,其中包含模板引用和数据。

例如:

view: post.show with:post

当模板不存在时,Blueprint将为视图生成Blade模板。

redirect

使用value作为对传递任何数据作为参数的命名路由的引用,生成return redirect()语句。

例如:

redirect: post.show with:post

dispatch

生成一个语句以分发Job使用value以实例化对象并传递任何数据。

例如:

dispatch: SyncMedia with:post

如果所引用的 job 类不存在,那么Blueprint将使用任何数据创建一个属性并使用__ construct方法对其进行分配。

fire

生成一个语句以分发 Event 使用value以实例化对象并传递任何数据。

例如:

fire: NewPost with:post

如果所引用的 event 类不存在,那么Blueprint将使用任何数据创建一个属性,并使用__ construct方法对其进行分配。

send

生成一个语句以发送 Mailable 使用value初始化对象,指定接收者并传递任何数据。

例如:

send: ReviewNotification to:post.author with:post

如果所引用的 mailable 类不存在,那么Blueprint将使用任何数据创建一个属性,并使用__ construct方法对其进行分配。

参考

为了方便起见,Blueprint将使用控制器的名称来推断相关模型。例如,Blueprint将假设PostController关联到Post模型。

Blueprint还支持点(.)语法,用于更复杂的引用。这使您可以定义引用其他模型上的列的值。

例如,要在PostController中查找*User模型,可以使用:

controllers:
  Post:
    show:
      find: user.id
      # ...

虽然这些引用经常在 Eloquent query语句中使用,但它们也可以在其他语句中使用。必要时,Blueprint将使用箭头(->)语法将它们转换为变量引用。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://laravel-news.com/laravel-shift-b...

译文地址:https://learnku.com/laravel/t/39294

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!