[扩展推荐] Laravel Shift 推出的代码生成器 Blueprint
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组件:
- 用于
Post
的 model 类,该类具有可填充
,casts
和dates
属性以及关系方法。 - migration 创建
posts
表。 - factory智能设置带有伪数据的列。
- 用于
PostController
的 controller 类,具有index
和store
操作,并为每个[语句] 生成了代码(https://github.com/laravel -shift / blueprint#statements)。 - 用于
PostController
操作的 Routes 。 - form request 的
StorePostRequest
验证title
和content
基于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创建两个模型:分别为Post
和Comment
。您可以继续定义其他模型。
Blueprint建议以其 StudlyCase 定义单数形式的模型名称,以遵循Laravel命名约定。例如,Post
而不是post
或posts
。
同样,列名将按原样使用。这些列的属性可以是[列类型和列修饰符。您可以按原样或使用小写字母定义它们。
对于复杂的属性,您可以使用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将使用SoftDeletes
trait生成一个Comment
类。它还将为整数外键创建一个具有适当数据类型的user_id
列。
Blueprint还检查列并将其分配给fillable
,casts
和dates
属性,并生成关系方法。
默认情况下,除id
和 timestamps 外的所有列都将添加到fillable
属性中。
在适当的情况下,Blueprint 将会 转换 列为integer
, boolean
, 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将生成两个控制器。具有index
,create
和store
操作的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支持为all
,get
,pluck
和count
生成查询语句。
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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。