mamun / generators
Laravel 4 Generators w/ Bootstrap 3
Requires
- php: >=5.3.0
- mustache/mustache: 2.4.*
Requires (Dev)
- illuminate/console: ~4
- illuminate/filesystem: ~4
- illuminate/support: ~4
- mockery/mockery: 0.8.*
This package is not auto-updated.
Last update: 2024-09-14 16:50:18 UTC
README
从 JeffreyWay/Laravel-4-Generators 分支而来。
此包更新了 Jeffrey Way 的原始作品提供的视图,以适配 Bootstrap 3。以下为 Way 的原始文档。说明已经更新,以反映此包中的任何变化。
此 Laravel 4 包提供各种生成器,以加快您的开发过程。这些生成器包括
generate:model
generate:controller
generate:seed
generate:view
generate:migration
generate:resource
generate:scaffold
generate:form
generate:test
generate:pivot
<-- 新功能!!
喜欢视频教程?
安装
首先,通过 Composer 安装此包。编辑您项目的 composer.json
文件,添加对 mamun/generators
的需求。
"require": {
"laravel/framework": "4.0.*",
"mamun/generators": "dev-master"
},
"minimum-stability" : "dev"
接下来,在终端更新 Composer
composer update
此操作完成后,最后一步是添加服务提供者。打开 app/config/app.php
,并向 providers 数组添加一个新项。
'Mamun\Generators\GeneratorsServiceProvider'
这就完成了!您已经准备就绪。从终端运行 artisan
命令,以查看新的 generate
命令。
php artisan
还有一个可用的 Sublime Text 插件,可以帮助使用生成器。当然,在您学习下面的语法之前,请一定要使用它。
用法
将生成器视为加快工作流程的简单方法。您不需要打开模型目录,创建新文件,保存它,并添加类,只需运行一个生成命令即可。
迁移
Laravel 4 提供了迁移生成器,但它仅创建模式(或表的字段)。让我们通过使用 generate:migration
来看看几个示例。
php artisan generate:migration create_posts_table
如果我们没有指定 fields
选项,将在 app/database/migrations
内创建以下文件。
<?php use Illuminate\Database\Migrations\Migration; class CreatePostsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('posts', function($table) { $table->increments('id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('posts'); } }
请注意,生成器足够智能,可以检测到您正在尝试创建一个表。当命名迁移时,尽量使它们尽可能详细。迁移生成器将检测迁移名称中的第一个单词,并尽力确定如何进行。因此,对于 create_posts_table
,关键字是 "create",这意味着我们应该准备必要的模式以创建表。
如果您使用类似于 add_user_id_to_posts_table
的迁移名称,在这种情况下,关键字是 "add",表示我们打算向现有表添加行。让我们看看它生成了什么。
php artisan generate:migration add_user_id_to_posts_table
这将准备以下样板文件
<?php use Illuminate\Database\Migrations\Migration; class AddUserIdToPostsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('posts', function($table) { }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('posts', function($table) { }); } }
请注意,这次我们没有使用 Schema::create
。
关键字
在编写迁移名称时,请使用以下关键字为生成器提供提示。
create
或make
(例如create_users_table
)add
或insert
(例如add_user_id_to_posts_table
)remove
或drop
或delete
(例如remove_user_id_from_posts_table
)
生成模式
这很好,但让我们更进一步,并使用 fields
选项生成模式。
php artisan generate:migration create_posts_table --fields="title:string, body:text"
在我们解读这个新选项之前,让我们看看输出结果
<?php use Illuminate\Database\Migrations\Migration; class CreatePostsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('posts', function($table) { $table->increments('id'); $table->string('title'); $table->text('body'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('posts'); } }
很好!请注意以下几点
- 生成器将自动将
id
设置为主键。 - 它还会添加时间戳,因为这是更常见的情况。
- 它解析了
fields
选项,并添加了这些字段。 - 删除方法足够智能,可以理解反向操作应该完全删除表格。
要声明字段,使用键值对选项集合的逗号分隔列表,其中 key
是字段的名称,value
是 列类型,而 option
是指定索引等的方式,如 unique
或 nullable
。以下是一些示例
--fields="first:string, last:string"
--fields="age:integer, yob:date"
--fields="username:string:unique, age:integer:nullable"
--fields="name:string:default('John'), email:string:unique:nullable"
--fields="username:string[30]:unique, age:integer:nullable"
请注意最后一个示例,我们指定了字符限制: string[30]
。这将生成 $table->string('username', 30)->unique();
可以通过以下方式删除表
php artisan generate:migration destroy_posts_table
如果您想设置精确的 artisan 回滚选项,请也将 fields
选项设置为
php artisan generate:migration destroy_posts_table --fields="title:string, body:text"
作为最后的演示,让我们运行一个迁移,从一个 tasks
表中删除 completed
字段。
php artisan generate:migration remove_completed_from_tasks_table --fields="completed:boolean"
这次,由于我们使用的是 "remove" 关键字,生成器理解它应该删除一个列,并在 down()
方法中重新添加它。
<?php use Illuminate\Database\Migrations\Migration; class RemoveCompletedFromTasksTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('tasks', function($table) { $table->dropColumn('completed'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('tasks', function($table) { $table->boolean('completed'); }); } }
模型
php artisan generate:model Post
这将创建文件,app/models/Post.php
并插入以下模板
<?php class Post extends Eloquent { }
视图
php artisan generate:view dog
此命令将生成 app/views/dog.blade.php
和一个简单的字符串,以便方便使用。
The dog.blade.php view.
与所有命令一样,您可以指定一个 --path
选项来将此文件放在其他位置。
php artisan generate:view index --path=views/dogs
现在,我们得到: app/views/dogs/index.blade.php
。
种子
Laravel 4 提供了一种灵活的方式来为新表生成种子。
php artisan generate:seed dogs
将参数设置为所需的表名,这将生成 app/database/seeds/DogsTableSeeder.php
并填充它
<?php class DogsTableSeeder extends Seeder { public function run() { $dogs = [ ]; DB::table('Dogs')->insert($dogs); } }
此命令还将更新 app/database/seeds/DatabaseSeeder.php
以包含对新的种子类的调用,这是 Laravel 所需的。
要全面填充 dogs
表
- 在
$dogs
数组中,添加任意数量的数组,包含必要的行。 - 回到终端并运行 Laravel 的
db:seed 命令
(php artisan db:seed
)。
资源
将资源生成器视为大菜。它调用所有的兄弟生成命令。假设以下命令
php artisan generate:resource dog --fields="name:string"
以下操作将发生
- 创建一个包含名称列的
create_dogs_table
迁移。 - 创建一个
Dog.php
模型。 - 创建一个包含
index
、show
、create
和edit
视图的views/dogs
文件夹。 - 创建一个
database/seeds/DogsTableSeeder.php
种子文件。 - 更新
DatabaseSeeder.php
以运行DogsTableSeeder
- 创建
controllers/DogsController.php
,并填充它以包含 restful 方法。 - 更新
routes.php
以包含:Route::resource('dogs', 'DogsController')
。 - 创建一个
tests/controllers/DogsControllerTest.php
文件,并填充一些模板测试以供您开始。
请注意,资源名称是单数 - 与您命名模型的方式相同。
工作流程
让我们创建一个用于以 restful 方式显示狗的资源。
php artisan generate:resource dog --fields="name:string, age:integer"
接下来,我们将为这个新的 dogs
表生成种子。打开 database/seeds/DogsTableSeeder.php
并添加几行。记住,您只需编辑此文件中的 $dogs
数组。
$dogs = [
['name' => 'Sparky', 'age' => 5],
['name' => 'Joe', 'age' => 11]
];
现在,我们迁移数据库并填充 dogs
表。
php artisan migrate
php artisan db:seed
最后,让我们在访问 dogs/
路由时显示这两只狗。编辑 controllers/DogsController.php
,并更新 index
方法,如下所示
public function index()
{
return View::make('dogs.index')
->with('dogs', Dog::all());
}
最后一步是更新视图以显示传递给它的每个帖子。打开 views/dogs/index.blade.php
并添加
<ul>
@foreach($dogs as $dog)
<li>{{ $dog->name }} : {{ $dog->age }}</li>
@endforeach
</ul>
好吧,好吧,我们不是使用带有正确 HTML 的布局文件。谁在乎;这只是个例子,傻瓜。
不管怎样,我们已经准备好了。运行服务器,并浏览到 localhost:8000/dogs
来查看您的列表。
php artisan serve
- Sparky : 5
- Joe : 11
这种方式难道不是比手动写所有内容要快吗?最后,我们来运行测试,确保一切按预期工作。
phpunit
而且……它是绿色的!
脚手架
把脚手架想象成资源的扩展。它具有完全相同的接口。
php artisan generate:scaffold tweet --fields="author:string, body:text"
唯一的不同之处在于,它会处理所有样板代码。这在进行原型设计时特别有用——甚至可以学习如何做基本的事情,比如从数据库表中删除记录,或者构建一个表单,或者在该表单上进行验证。
表单
这个方便的新生成器允许你通过单个命令,根据提供的模型属性生成必要的表单HTML。也许一个例子是合适的
php artisan generate:form tweet
假设我确实有一个Tweet
模型及其相关的tweet
表,这个命令将输出
{{ Form::open(array('route' => 'tweets.store')) }} <ul> <li> {{ Form::label('author', 'Author:') }} {{ Form::text('author') }} </li> <li> {{ Form::label('body', 'Body:') }} {{ Form::textarea('body') }} </li> <li> {{ Form::submit() }} </li> </ul> {{ Form::close() }}
真不错,不是吗?它读取了属性和数据类型,并为你准备好了标记!又少了一件需要担心的事情!
指定表单方法
但如果你打算更新资源而不是创建一个新的,怎么办呢?在这种情况下,使用--method
选项。
php artisan generate:form tweet --method="update"
这将会生成几乎相同的HTML,但是,根据需要调整Form::open()
方法
{{ Form::open(array('method' => 'PATCH', 'route' => 'tweets.update')) }}
方法选项可以接受任意数量的值(例如添加、编辑、更新、发布、创建等),但本质上,你只是在告诉它你是创建还是编辑资源。因此,只有两种可能的输出:POST
和PATCH
(前者是默认值)。
自定义HTML
如果你不喜欢使用无序列表作为表单,可以使用--html
选项,并指定你希望使用的元素名称
php artisan generate:form tweet --html="div"
现在,我们将使用div
来展示生成器中的元素!
{{ Form::open(array('route' => 'tweets.store')) }} <div> {{ Form::label('author', 'Author:') }} {{ Form::text('author') }} </div> <div> {{ Form::label('body', 'Body:') }} {{ Form::textarea('body') }} </div> <div> {{ Form::submit() }} </div> {{ Form::close() }}
复制和保存
至少目前是这样,与这个包中的其他生成器不同,这个命令会输出表单,此时你可以将其复制粘贴到所需位置。当然,你可以使用现有的工具将输出重定向到剪贴板或保存到文件。例如
# copy the output to the clipboard php artisan generate:form tweet | pbcopy # save it to a form partial php artisan generate:form tweet > app/views/posts/form.blade.php
测试
当需要创建新的PHPUnit测试类时,使用generate:test
。以下是一个示例
php artisan generate:test FooTest
这将产生app/tests/FooTest.php
。
<?php class FooTest extends TestCase { public function test() { } }
交叉表
创建可连接/枢纽表有时可能会很复杂。
- 表名应该是复数吗?
- 我们应该以什么顺序编写表名才能让Laravel满意?
- 枢纽表应该有哪些字段?
现在这个过程可以自动化。只需调用generate:pivot
命令,并提供应该可连接的表名。例如,一篇文章可以有多个标签,一个标签也可以有多个文章。运行以下命令创建必要的枢纽表。
php artisan generate:pivot posts tags
提供的表名顺序(或是否复数化)无关紧要。该命令将正确创建一个具有post_id
和tag_id
字段的post_tag
迁移。
Schema::create('post_tag', function(Blueprint $table) { $table->integer('post_id'); $table->integer('tag_id'); });
最后,简单地迁移数据库以创建它。
php artisan migrate
枢纽表完成!
让我们从头开始,我们需要一个文章表、一个标签表,以及两个表之间的连接枢纽表。我们可以轻松地使用生成器来处理这个问题。
php artisan generate:migration create_posts_table --fields="title:string, description:text" php artisan generate:migration create_tags_table --fields="name:string" php artisan generate:pivot posts tags