## 使用自定义代码生成工具快速进行Laravel开发
这个Laravle包提供了一种代码生成器,使得你可以加速你的开发进程,这些生成器包括:
* generate:model – 模型生成器
* generate:view – 视图生成器
* generate:controller – 控制器生成器
* generate:seed – 数据库填充器
* generate:migration – 迁移
* generate:pivot – 关联表
* generate:resource -资源
* generate:scaffold – 脚手架
项目地址
> https://github.com/laracasts/Laravel-5-Generators-Extended
## 安装
#### Laravel 4.2 或者更低的版本
使用Composer安装这个包,编辑你项目的composer.json文件,在`require`中添加`way/generators`
~~~
"require-dev": {
"way/generators": "~2.0"
}
~~~
然后,在命令行下执行`composer update`:
~~~
composer update --dev
~~~
一旦这个操作完成,就只需要最后一步,在配置文件中加入服务提供者。打开`app/config/app.php`文件,添加一个新的记录到`providers`数组中.
~~~
'Way\Generators\GeneratorsServiceProvider'
~~~
这样就可以了,你已经安装完成并可以运行这个包了。运行artisan命令行则可以在终端上看到`generate`相关命令。
~~~
php artisan
~~~
#### Laravel 5.0 或者更高版本
使用Composer安装这个包,编辑你项目的`composer.json`文件,在`require`中添加`way/generators`
~~~
"require-dev": {
"way/generators": "~3.0"
}
~~~
由于在Laravel高版本中默认文件夹结构,需要3.0或者更高的版本,才能适应5.0版本以上的Laravel
然后,在命令行下执行`composer update`:
~~~
composer update --dev
~~~
一旦这个操作完成,就只需要最后一步,在配置文件中加入服务提供者。打开`app/config/app.php`文件,添加一个新的记录到`providers`数组中.
~~~
'Way\Generators\GeneratorsServiceProvider'
~~~
这样就可以了,你已经安装完成并可以运行这个包了。运行artisan命令行则可以在终端上看到`generate`相关命令。
~~~
php artisan
~~~
## 使用示例
想象一下使用一个生成器加速你的工作流。而不是打开models文件夹,创建一个新的文件,保存它,并且在文件中添加一个class,你可以简单的运行一个生成器命令即可完成这一系列动作。
* Migrations 迁移
* Models 模型
* Views 视图
* Seeds 填充
* Pivot 关联表
* Resources 资源
* Scaffolding 脚手架
* Configuration 配置
#### 迁移
Laravel提供了一个迁移生成器,但是它仅仅能够创建数据库结构。让我们再回顾几个例子,使用`generate:migration`。
~~~
php artisan generate:migration create_posts_table
~~~
如果我们不指定字段配置项,则下面这个文件将被创建在`app/database/migrations`目录下。
~~~
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
class CreatePostsTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function(Blueprint $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;
use Illuminate\Database\Schema\Blueprint;
class AddUserIdToPostsTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('posts', function(Blueprint $table) {
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('posts', function(Blueprint $table) {
});
}
}
~~~
> 注意:这一次我们没有做Schema::create
#### 关键字
当你在写迁移的名字的时候,使用下面的关键字给生成器提供提示。
* create or make (create_users_table)
* add or insert (add_user_id_to_posts_table)
* remove (remove_user_id_from_posts_table)
* delete or drop (delete_users_table)
#### 生成数据库模式
这是非常漂亮的,但是让我们更进一步,生成数据库模式的同时,使用`fields`选项。
~~~
php artisan generate:migration create_posts_table --fields="title:string, body:text"
~~~
在我们解释这个选项之前,让我们先看一下输出:
~~~
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
class CreatePostsTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function(Blueprint $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`选项,并添加这些字段
* drop方法能够足够聪明的意识到,在相反的情况下,这个表应该被完全删除
声明字段,使用逗号+空格分隔键值列表[`key:value:option sets`],其中`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 Doe'), bio:text:nullable"
* --fields="username:string(30):unique, age:integer:nullable:default(18)"
请注意最后一个示例,这里我们指定了`string(30)`的字符串限制。这将产生`$table->string('username', 30)->unique()`;
使用生成器删除表是可能的:
~~~
php artisan generate:migration delete_posts_table
~~~
作为最后一个示例i,让我们运行一个迁移,从`tasks`表中,删除`completed`字段。
~~~
php artisan generate:migration remove_completed_from_tasks_table --fields="completed:boolean"
~~~
这一次,我们使用了"`remove`"关键字,生成器知道它要删除一个字段,并且把它添加到`down()`方法中。
~~~
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
class RemoveCompletedFromTasksTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('tasks', function(Blueprint $table) {
$table->dropColumn('completed');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('tasks', function(Blueprint $table) {
$table->boolean('completed');
});
}
}
~~~
## 模型
~~~
php artisan generate:model Post
~~~
这将生成一个文件,app/models/Post.php并且写入下面的样板
~~~
<?php
class Post extends \Eloquent {
}
~~~
## 视图
视图生成器相当简单。
~~~
php artisan generate:view admin.reports.index
~~~
这个命令将创建一个空的视图,`/app/views/admin/reports/index.blade.php`。如果提供的文件夹不存在,它会自动帮你创建
`Seeds` 生成数据[译注:应该是用来填充测试数据]
Laravel为我们提供了非常灵活的方式来填充表 Laravel provides us with a flexible way to seed new tables.
~~~
php artisan generate:seed users
~~~
设置你想要生成的生成文件参数。这将生成 `app/database/seeds/UsersTableSeeder.php` 并用一下内容作为填充:
~~~
<?php
// Composer: "fzaninotto/faker": "v1.3.0"
use Faker\Factory as Faker;
class UsersTableSeeder extends Seeder {
public function run()
{
$faker = Faker::create();
foreach(range(1, 10) as $index)
{
User::create([
]);
}
}
}
~~~
这将使用流行的`Faker`库为你提供一个基本的样板。这将是一个非常漂亮的方式来生成你的数据库表。不要忘记使用`Composer`来安装`Faker`!
> 关联表[译注:pivot 这个词愿意是中心点、中枢的意思,这里翻译成关联表比较合适,通俗一点就是两个表的mapping关系表,带有外键约束]
当你需要一个关联表时,`generate:pivot`可以加速建立相应的表。
简单的传递两个需要关联的表的名字。对于`orders`和`users`表,你可以:
~~~
php artisan generate:pivot orders users
~~~
这个命令将创建下面的迁移:
~~~
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
class CreateOrderUserTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('order_user', function(Blueprint $table) {
$table->increments('id');
$table->integer('order_id')->unsigned()->index();
$table->foreign('order_id')->references('id')->on('orders')->onDelete('cascade');
$table->integer('user_id')->unsigned()->index();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('order_user');
}
}
~~~
> 注意:它会正确设置你提供的两个表名,排名不分先后。现在,运行php artisan migrate来创建你的关联表!
## 资源
`generate:resource`命令将会为你坐一系列的事情:
* 生成一个模型
* 生成index, show, create, edit视图
* 生成一个控制器
* 生成一个数据库结构迁移
* 生成一个数据库填充
* 迁移这个数据库
当你触发这个命令,它将对每个动作进行问询。通过这个方式,你可以告诉生成器,哪些是你确实需要的。
例子
想象如果你需要创建一个方法来显示文章。你需要手动创建一个控制器,一个模型,一个数据库迁移并且填充它,并且创建一个数据库填充…为什么不用生成器来做呢?
~~~
php artisan generate:resource post --fields="title:string, body:text"
~~~
如果你对每个询问说yes,这个命令会给你如下样板:
* app/models/Post.php
* app/controllers/PostsController.php
* app/database/migrations/timestamp-create_posts_table.php (including the schema)
* app/database/seeds/PostsTableSeeder.php
## Scaffolding 脚手架
脚手架生成器类似于`generate:resource`,除了创建一些初始化样板外,同时也是为了方便。
例如,在运行`generate:scaffold post`时,你的控制器模板将会将会是:
~~~
<?php
class PostsController extends \BaseController {
/**
* Display a listing of posts
*
* @return Response
*/
public function index()
{
$posts = Post::all();
return View::make('posts.index', compact('posts'));
}
/**
* Show the form for creating a new post
*
* @return Response
*/
public function create()
{
return View::make('posts.create');
}
/**
* Store a newly created post in storage.
*
* @return Response
*/
public function store()
{
$validator = Validator::make($data = Input::all(), Post::$rules);
if ($validator->fails())
{
return Redirect::back()->withErrors($validator)->withInput();
}
Post::create($data);
return Redirect::route('posts.index');
}
/**
* Display the specified post.
*
* @param int $id
* @return Response
*/
public function show($id)
{
$post = Post::findOrFail($id);
return View::make('posts.show', compact('post'));
}
/**
* Show the form for editing the specified post.
*
* @param int $id
* @return Response
*/
public function edit($id)
{
$post = Post::find($id);
return View::make('posts.edit', compact('post'));
}
/**
* Update the specified resource in storage.
*
* @param int $id
* @return Response
*/
public function update($id)
{
$post = Post::findOrFail($id);
$validator = Validator::make($data = Input::all(), Post::$rules);
if ($validator->fails())
{
return Redirect::back()->withErrors($validator)->withInput();
}
$post->update($data);
return Redirect::route('posts.index');
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return Response
*/
public function destroy($id)
{
Post::destroy($id);
return Redirect::route('posts.index');
}
}
~~~
请注意我们鼓励您去修改这些自动生成的控制器。它只是一个简单的开始。
`Configuration` 配置
你或许想修改你的模板–自动生成的文件是怎样格式化的。考虑到这一点,你需要发布你的模板,生成器将会使用它们。
~~~
php artisan generate:publish-templates
~~~
你要复制所有app/templates目录下的模板。你可以修改这些只要你满意它的格式。如果你喜欢不同的目录:
~~~
php artisan generate:publish-templates --path=app/foo/bar/templates
~~~
当你运行`generate:publish-templates` ,它也会将配置发布到`app/config/packages/way/generators/config/config.php`文件。这个文件看起来有点像:
~~~
<?php
return [
/*
|--------------------------------------------------------------------------
| Where the templates for the generators are stored...
|--------------------------------------------------------------------------
|
*/
'model_template_path' => '/Users/jeffreyway/Desktop/generators-testing/app/templates/model.txt',
'scaffold_model_template_path' => '/Users/jeffreyway/Desktop/generators-testing/app/templates/scaffolding/model.txt',
'controller_template_path' => '/Users/jeffreyway/Desktop/generators-testing/app/templates/controller.txt',
'scaffold_controller_template_path' => '/Users/jeffreyway/Desktop/generators-testing/app/templates/scaffolding/controller.txt',
'migration_template_path' => '/Users/jeffreyway/Desktop/generators-testing/app/templates/migration.txt',
'seed_template_path' => '/Users/jeffreyway/Desktop/generators-testing/app/templates/seed.txt',
'view_template_path' => '/Users/jeffreyway/Desktop/generators-testing/app/templates/view.txt',
/*
|--------------------------------------------------------------------------
| Where the generated files will be saved...
|--------------------------------------------------------------------------
|
*/
'model_target_path' => app_path('models'),
'controller_target_path' => app_path('controllers'),
'migration_target_path' => app_path('database/migrations'),
'seed_target_path' => app_path('database/seeds'),
'view_target_path' => app_path('views')
];
~~~
同时,当你修改这个文件的时候,注意你也可以更新每个默认的生成器目标目录。
## Shortcuts 快捷命令
因为你可能会一次又一次的键入如下命令,命令别名显然是有意义的。
~~~
# Generator Stuff
alias g:m="php artisan generate:model"
alias g:c="php artisan generate:controller"
alias g:v="php artisan generate:view"
alias g:s="php artisan generate:seed"
alias g:mig="php artisan generate:migration"
alias g:r="php artisan generate:resource"
~~~
这些将被保存,例如,你的`~/.bash_profile` 或者 `~/.bashrc` 文件中。
* * * * *
原文地址:[http://www.huyanping.cn/?p=364](http://www.huyanping.cn/?p=364)
- 前言
- 发行说明/L5新特性
- 升级向导
- 升级到 5.0.16
- 从 4.2 升级到 5.0
- 从 4.1 升级到 4.2
- 从 4.1.x 升级到 4.1.29
- 从 4.1.25 升级到 4.1.26
- 从 4.0 升级到 4.1
- 贡献向导
- 环境配置
- 安装
- 配置
- 基本功能
- 路由
- 基本路由
- CSRF 保护
- 方法欺骗
- 路由参数
- 命名路由
- 路由群组
- 路由模型绑定
- 抛出 404 错误
- 中间件
- 建立中间件
- 注册中间件
- 可终止中间件
- 控制器
- 基础控制器
- 控制器中间件
- 隐式控制器
- RESTful 资源控制器
- 请求
- 取得请求实例
- 取得输入数据
- 旧输入数据
- Cookies
- 上传文件
- 其他的请求信息
- 响应
- 基本响应
- 重定向
- 其他响应
- 响应宏
- 系统架构
- 服务提供者
- 基本提供者例子
- 注册提供者
- 缓载提供者
- 服务容器
- 基本用法
- 将接口绑定到实现
- 上下文绑定
- 标签
- 实际应用
- 容器事件
- 参考:理解PHP 依赖注入|Laravel IoC容器
- Contracts
- 为什么用 Contracts
- Contract 参考
- 如何使用 Contracts
- Facades
- 实际用法
- 建立 Facades
- 模拟 Facades
- Facade 类参考
- 请求的生命周期
- 生命周期概要
- 聚焦于服务提供者
- 应用程序结构
- 根目录
- App 目录
- 为应用程序配置命名空间
- 系统服务
- 认证
- 用户认证
- 取得经过认证的用户
- 保护路由
- HTTP 基本认证
- 忘记密码与重设
- 第三方登陆认证
- 交易
- 配置文件
- 订购方案
- 一次性付款
- Single Charges
- 免信用卡试用
- 订购转换
- 订购数量
- 取消订购
- 恢复订购
- 确认订购状态
- 处理失败订阅
- 处理其它 Stripe Webhooks
- 收据
- 缓存
- 配置
- 缓存用法
- 递增与递减
- 缓存标签
- 缓存事件
- 数据库缓存
- 集合
- Command Bus
- 建立命令
- 调用命令
- 命令队列
- 命令管道
- 核心扩展
- 管理者和工厂
- 缓存
- Session
- 认证
- 基于服务容器的扩展
- Laravel Elixir
- 安装与配置
- 使用方式
- Gulp
- Custom Tasks and Extensions
- 加密
- Envoy 任务执行器
- 安装
- 执行任务
- 多服务器
- 并行执行
- 任务宏
- 通知
- 更新 Envoy
- 错误与日志
- 配置
- 错误处理
- HTTP 异常
- 日志
- 事件
- 基本用法
- 事件处理队列
- 事件订阅者
- 文件系统与云存储
- 配置文件
- 基本用法
- 自定义文件系统
- 哈希
- 基本用法
- 辅助方法
- 数组
- 路径
- 路由
- 字符串
- 网址(URL)
- 其他
- 本地化
- 语言文件
- 基本用法
- 复数
- 验证
- 覆写扩展包的语言文件
- 邮件
- 配置
- 基本用法
- 内嵌附件
- 邮件队列
- 邮件与本地端开发
- 扩展包开发
- 视图
- 语言
- 配置文件
- 公共资源
- 发布分类文件
- 路由
- 分页
- 配置
- 使用
- 追加分页链接
- 转换至 JSON
- 队列
- 设置
- 基本用法
- 队列闭包
- 执行一个队列监听
- 常驻队列处理器
- 推送队列
- 已失败的工作
- 会话
- 配置
- 使用 Session
- 暂存数据(Flash Data)
- 数据库 Sessions
- Session 驱动
- 模板
- Blade 模板
- Blade 控制语法结构
- Blade 扩展
- 参考:@section与@yield 介绍
- 单元测试
- 定义并执行测试
- 测试环境
- 从测试调用路由
- 模拟 Facades
- 框架 Assertions
- 辅助方法
- 重置应用程序
- 表单验证
- 基本用法
- 控制器验证
- 表单请求验证
- 使用错误信息
- 错误信息 & 视图
- 可用验证规则
- 条件验证规则
- 自定义错误信息
- 自定义验证规则
- 数据库
- 使用基础
- 配置
- 读取/写入连接
- 执行查找
- 数据库事务处理
- 获取连接
- 日志记录
- 查询构造器
- Selects
- Joins
- 高级 Wheres
- 聚合
- 原生表达式
- 添加
- 更新
- 删除
- Unions
- 悲观锁定 (Pessimistic Locking)
- Eloquent ORM
- 基本用法
- 批量赋值
- 新增,更新,删除
- 软删除
- 时间戳
- 范围查询
- Global Scopes
- 关联
- 关联查询
- 预载入
- 新增关联模型
- 更新上层时间戳
- 使用枢纽表
- 集合
- 获取器和修改器
- 日期转换器
- 属性类型转换
- 模型事件
- 模型观察者
- 模型 URL 生成
- 转换成数组 / JSON
- 结构生成器
- 建立与删除数据表
- 加入字段
- 修改字段
- 修改字段名称
- 移除字段
- 检查是否存在
- 加入索引
- 外键
- 移除索引
- 移除时间戳记和软删除
- 保存引擎
- 迁移和数据填充
- 建立迁移文件
- 执行迁移
- 回滚迁移
- 数据填充
- Redis
- 配置
- 使用方式
- 管道
- 开发包
- Confide 用户身份认证
- Entrust 权限管理
- Shoppingcart 购物车
- Genertators 代码生成工具
- IDE Helper IDE助手
- Artisan 命令行工具
- 概览
- 用法
- 在命令行接口以外的地方调用命令
- 定时调用 Artisan 命令
- 开发
- 建立自定义命令
- 注册自定义命令