# 发行说明
- [支持策略](#support-policy)
- [Laravel 5.3](#laravel-5.3)
- [Laravel 5.2](#laravel-5.2)
- [Laravel 5.1.11](#laravel-5.1.11)
- [Laravel 5.1.4](#laravel-5.1.4)
- [Laravel 5.1](#laravel-5.1)
- [Laravel 5.0](#laravel-5.0)
- [Laravel 4.2](#laravel-4.2)
- [Laravel 4.1](#laravel-4.1)
<a name="support-policy"></a>
## 支持策略
Laravel 5.1 LTS 版本会提供两年的 BUG 修复及三年的安全性修复,LTS 版本是 Laravel 能提供的维护时间最长的发行版。
对于一般的版本,会提供六个月的 BUG 修复及一年的安全性修复。
> [Laravel 的发布路线图](https://phphub.org/topics/2594) - by [Summer](http://github.com/summerblue)
<a name="laravel-5.3"></a>
## Laravel 5.3
Laravel 5.3 在 5.2 基础上进行了优化,新特性包括以下:
* [消息通知系统 Laravel Notifications](/docs/5.3/notifications);
* [事件广播系统 Laravel Echo](/docs/5.3/broadcasting);
* [Laravel Passport 快速 OAuth2 服务器的扩展包](/docs/5.3/passport);
* [Laravel Scout 全文搜索引擎](/docs/5.3/scout);
* Laravel Elixir 开始支持 Webpack;
* 邮件操作 Laravel Mailable;
* `web` 和 `api` 的路由分离;
* 基于闭包的控制台命令;
* 上传文件存储的帮助函数;
* 支持 POPO 和单动作控制;
* 优化默认前端脚手架,等。
### 消息通知 Notifications
> {video} Laracasts 上关于此功能的免费视频 [video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-3/episodes/9)。
Laravel Notifications 提供了简单、优雅的 API 支持你在不同的发送媒介中发送通知,例如邮件、SMS、Slack 等等。
例如,你可以定义一个单据已经支付的通知,然后通过邮件和 SMS 发送这个通知:
$user->notify(new InvoicePaid($invoice));
[Laravel 社区](http://laravel-notification-channels.com) 已经为通知系统编写了各式的驱动,甚至包括对 iOS 和 Android 通知的支持,更多关于通知系统的信息,请查看 [完整的文档](/docs/5.3/notifications)。
### WebSockets / 事件广播
事件广播在之前版本的 Laravel 中已经存在,Laravel 5.3 现支持对私有和已存在的 WebSocket 频道添加频道级认证:
/*
* 频道认证
*/
Broadcast::channel('orders.*', function ($user, $orderId) {
return $user->placedOrder($orderId);
});
Laravel Echo 是一个可通过 NPM 安装的全新的 JavaScript 包,会和 Laravel 5.3 一起发布,Echo 为客户端 JavaScript 中监听服务器端事件提供了简单、优雅的 API 接口。
Echo 默认包含对 [Pusher](https://pusher.com) 和 [Socket.io](http://socket.io) 的支持:
Echo.channel('orders.' + orderId)
.listen('ShippingStatusUpdated', (e) => {
console.log(e.description);
});
除了订阅到传统频道上,Laravel Echo 也让频道间的监听变得简单:
Echo.join('chat.' + roomId)
.here((users) => {
//
})
.joining((user) => {
console.log(user.name);
})
.leaving((user) => {
console.log(user.name);
});
更多信息请查阅 [完整文档](/docs/5.3/broadcasting).
### Laravel Passport (OAuth2 认证服务)
> {video} Laracasts 上关于此功能的免费视频 [video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-3/episodes/13)。
Laravel 5.3 的 Passport 让 API 认证变得简单。Laravel Passport 可以让你在几分钟内为应用程序创建一个完整的 OAuth2 认证服务,Passport 基于 Alex Bilbie 的 [League OAuth2 server](https://github.com/thephpleague/oauth2-server) 实现。
Passport 让发放 OAuth2 令牌(Access Token)变得轻松,你还可以允许用户通过 Web 界面创建 `个人访问令牌`。
为了方便提高开发效率,Passport 内置了一个 Vue 组件,该组件提供了 OAuth2 后台界面功能,允许用户创建客户端、撤销访问令牌,以及更多其他功能:
<passport-clients></passport-clients>
<passport-authorized-clients></passport-authorized-clients>
<passport-personal-access-tokens></passport-personal-access-tokens>
如果你不想使用 Vue 组件,你可以自由的定制用于管理客户端和访问令牌的前端、后台。Passport 提供了一个简单的 JSON API,你可以在前端使用任何 JavaScript 框架与之集成。
Passport 还提供了方便的 API 让你定制「Token 访问域」:
Passport::tokensCan([
'place-orders' => 'Place new orders',
'check-status' => 'Check order status',
]);
此外,Passport 还包含了一个用于检查「Token 访问域」访问权限的中间件:
Route::get('/orders/{order}/status', function (Order $order) {
// 检查令牌是否拥有访问域 "check-status"
})->middleware('scope:check-status');
最后,Passport 还支持从 JavaScript 应用访问你的 API,而不必担心访问令牌传输。
Passport 通过加密 JWT cookies 和同步「CSRF 令牌」来实现此功能,让你专注于业务开发。
更多关于 Passport 信息,请查看 [完整文档](/docs/5.3/passport)。
### 搜索系统 (Laravel Scout)
Laravel Scout 提供了一个简单的、基于驱动的、针对 [Eloquent](/docs/5.3/eloquent) 模型的全文搜索解决方案。
通过模型观察者,Scout 会自动同步更新 Eloquent 的搜索索引,目前,Scout使用 [Algolia](https://www.algolia.com/) 驱动,你可以自由的编写自己驱动来扩展 Scout。
你只需要添加 Searchable trait 到模型中,就能让模型支持搜索:
<?php
namespace App;
use Laravel\Scout\Searchable;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use Searchable;
}
在你在模型中添加 trait 以后,数据会在 `save` 的时候自动保持同步:
$order = new Order;
// ...
$order->save();
在模型被成功索引以后,可以很轻松的使用全文搜索,你甚至可以为索引的结果进行分页操作:
return Order::search('Star Trek')->get();
return Order::search('Star Trek')->where('user_id', 1)->paginate();
更多 Scout 功能,请查阅 [Scout 的完整文档](/docs/5.3/scout)。
### Mailable 对象
> {video} Laracasts 上关于此功能的免费视频 [video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-3/episodes/6)。
Laravel 5.3 Mailable 是一个崭新的 Mail 操作类,通过一种更加优雅的方式发送邮件,而不再需要在闭包中自定义邮件信息。
例如,定义一个简单的邮寄对象用作发送欢迎邮件:
class WelcomeMessage extends Mailable
{
use Queueable, SerializesModels;
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.welcome');
}
}
Mailable 对象被创建以后,你可以使用一个简单、优雅的 API 将其发送给用户:
Mail::to($user)->send(new WelcomeMessage);
Mailable 还支持队列操作,只需要在类声明里实现 `ShouldQueue` 即可:
class WelcomeMessage extends Mailable implements ShouldQueue
{
//
}
更多关于 Mailable 的信息,请查看 [完整文档](/docs/5.3/mail)。
### 存储上传文件
> {video} Laracasts 上关于此功能的免费视频 [video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-3/episodes/12)。
存储用户上传文件,在 Web 开发中是一个很常见的任务。
Laravel 5.3 提供了一个便捷的 `store` 方法,只需要对上传文件对象调用此方法,并传参准备存储的路径即可:
/**
* Update the avatar for the user.
*
* @param Request $request
* @return Response
*/
public function update(Request $request)
{
$path = $request->file('avatar')->store('avatars', 's3');
return $path;
}
更多上传文件信息,请查看 [完整文档](/docs/{{version}}/filesystem#file-uploads)。
### Webpack 和 Laravel Elixir
Laravel Elixir 6.0 与 Laravel 5.3 共同发布,内置了 Webpack 和 Rollup JavaScript。
默认情况下,Laravel 5.3 的 `gulpfile.js` 使用 Webpack 来编译你的 JavaScript 文件:
elixir(mix => {
mix.sass('app.scss')
.webpack('app.js');
});
完整文档请见 [Laravel Elixir](/docs/5.3/elixir) 。
### 前端架构
> {video} Laracasts 上关于此功能的免费视频 [video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-3/episodes/4)。
Laravel 5.3 提供了一个更加现代的前端架构。这主要会影响 `make:auth` 命令生成认证相关的前端脚手架代码,不再从 CDN 中加载前端资源,所有依赖被定义在默认的 package.json 文件中,你可以自行修改。
此外,支持单文件的 Vue 组件现在直接开箱即用, `resources/assets/js/components` 目录下包含了一个简单的示例 `Example.vue`,新的 `resources/assets/js/app.js` 用来配置 JavaScript 类库依赖和 Vue 子模块。
这种架构对开始开发现代的、强大的 JavaScript 应用提供了更好的支持,而不需要要求应用使用任何特定 JavaScript 或者 CSS 框架。
更多信息,请查看对应文档 [前端文档](/docs/5.3/frontend)。
### 路由文件
默认情况下,新安装的 Laravel 5.3 应用在新的顶级目录 `routes` 下包含了 `web.php` 和 `api.php` 两个 `HTTP` 路由文件,你也可以按照此方法自行扩展。
API 相关的路由在 `RouteServiceProvider` 中指定了自动添加 `api` 前缀。
### 闭包控制台命令
除了通过命令类定义之外,Artisan 命令现支持在 `app/Console/Kernel.php` 文件中使用简单闭包的方式定义。
在新安装的 Laravel 5.3 应用中,`commands` 方法会加载 `routes/console.php` 文件,从而允许你基于闭包、以路由风格定义控制台命令:
Artisan::command('build {project}', function ($project) {
$this->info('Building project...');
});
更多信息请参见 [Artisan 文档](/docs/5.3/artisan#closure-commands)。
### Blade 中的 `$loop` 魔术变量
> {video} Laracasts 上关于此功能的免费视频 [video tutorial](https://laracasts.com/series/whats-new-in-laravel-5-3/episodes/7)。
当我们在 Blade 模板中循环遍历的时候,`$loop` 魔术变量将会在循环中生效。通过该变量可以访问很多有用的信息,比如当前循环索引值,以及当前循环是第一个还是最后一个:
@foreach ($users as $user)
@if ($loop->first)
This is the first iteration.
@endif
@if ($loop->last)
This is the last iteration.
@endif
<p>This is user {{ $user->id }}</p>
@endforeach
更多信息请查看 [Blade 文档](/docs/5.3/blade#the-loop-variable).
<a name="laravel-5.2"></a>
## Laravel 5.2
Laravel 5.2 在 Laravel 5.1 的基础上进行了优化,新特性包括以下:
* 支持更多样的用户认证驱动;
* 隐式数据模型绑定;
* 简化 Eloquent 全局作用域;
* 内置用户认证脚手架支持;
* 中间件组;
* 访问频率限制中间件;
* 数组认证的优化等
### 用户认证驱动 / "多认证系统"
在之前的 Laravel 版本中,框架只支持默认的、基于 session 的认证驱动,且在单个应用中只能拥有一个认证模型类。
Laravel 5.2 对此进行了改进,你可以定义多个认证驱动,还支持多个可认证的数据模型以及用户表,并且可以独立控制其认证。
如果你的应用包含 `管理员用户数据表` 和一个 `学生用户数据表`,现在你可以使用 `Auth` 来实现管理员用户和学生用户的独立登录而互不影响。
### 用户认证脚手架
Laravel 不止提供服务器端的用户认证逻辑代码,Laravel 5.2 还提供了便捷的方式来创建认证视图,只需在终端执行下 `make:auth` 命令即可:
php artisan make:auth
该命令会生成纯文本、兼容 Bootstrap 样式,用于登录、注册和密码重置的视图。该命令还会顺带在路由文件中增加对应的授权路由。
> **注意**:该功能特性只能在新应用中使用,不能在应用升级过程中使用。
### 隐式数据模型绑定
隐式模型绑定使得在路由和控制器中注入模型实例更加便捷。假设你有一个路由定义如下:
use App\User;
Route::get('/user/{user}', function (User $user) {
return $user;
});
Laravel 5.1 中,你需要通过 `Route::model` 方法指示 Laravel 注入 `App\User` 实例来匹配路由中的 `{user}` 参数。
现在,在 Laravel 5.2 中,框架将会基于相应 URI 判断 **自动** 注入模型,从而允许你快速访问需要的模型实例。
如路由参数片段 `{user}` 匹配到 `路由闭包` 或 `控制器方法` 中对应参数 `$user`,且类型提示为 Eloquent 数据模型的话,Laravel 将会自动注入该模型。
更多隐式模型绑定信息,请查看 [HTTP 路由模型绑定部分](/docs/{{version}}/routing#Route-Model-Binding)。
### 中间件组
中间件组允许你使用单个 `键` 对相关路由中间件进行分组,从而实现为某个路由一次性指定多个中间件。例如,在同一个应用中同时构建 Web UI 和 API 时,这一特性就会派上用场,你可以将 Session 和 CSRF 路由分组到一个 `web` 组,或者将访问频率限制分组到 `api` 组中。
实际上,默认的 Laravel 5.2 应用结构采用的正是这个方法。例如,在默认的 `App\Http\Kernel.php` 文件中你会看到如下:
/**
* 应用程序的中间件分组
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
'api' => [
'throttle:60,1',
],
];
然后,`web` 组可以这样指定给路由:
Route::group(['middleware' => ['web']], function () {
//
});
默认的,所有的 `app/Http/routes.php` 中的路由 **已经** 在 `RouteServiceProvider` 的 `mapWebRoutes` 方法中指定了 `web` 中间件组,所以你不必重复指定。
### 访问频率限制
框架现在内置了一个新的访问频率限制中间件,允许你轻松控制给定 IP 地址在指定时间内对某个路由发起请求的数目。
例如,要限制某个 IP 地址每分钟只能访问某个路由 60 次,你可以这么做:
Route::get('/api/users', ['middleware' => 'throttle:60,1', function () {
//
}]);
### 数组输入验证
Laravel 5.2 可轻松实现表单字段的数组输入验证。例如,要验证指定数组输入字段中的每一个 email 是否唯一,可以这么做:
$validator = Validator::make($request->all(), [
'person.*.email' => 'email|unique:users'
]);
你可以使用 `*` 来自定义验证数组字段的错误消息提醒:
'custom' => [
'person.*.email' => [
'unique' => '用户的 Email 必须是唯一的',
]
],
### `bail` 验证规则
Laravel 5.2 新添加了一个 `bail` 认证规则,此规则会在第一个失败认证后停止后面的其他认证检查。例如:你想在 `integer` 数值检查失败后停止对 `unique` 唯一性的检查:
$this->validate($request, [
'user_id' => 'bail|integer|unique:users'
]);
### Eloquent 全局作用域优化
在之前的 Laravel 版本中,Eloquent 全局作用域的实现复杂且容易出错,但在 Laravel 5.2 中,全局查询作用域只需实现一个简单的 `apply` 方法即可。
更多关于全局作用域的使用,请查阅 [Eloquent 文档](/docs/{{version}}/eloquent#global-scopes).
<a name="laravel-5.1.11"></a>
## Laravel 5.1.11
Laravel 5.1.11 推出了内置的 [授权](/docs/{{version}}/authorization) 功能!利用回调和授权策略类,能更方便的组织应用程序的授权逻辑。
更多的信息请参考 [授权的文档](/docs/{{version}}/authorization)。
<a name="laravel-5.1.4"></a>
## Laravel 5.1.4
Laravel 5.1.4 增加了简单的登录限制功能。查阅 [认证的文档](/docs/{{version}}/authentication#authentication-throttling) 以获取更多信息。
<a name="laravel-5.1"></a>
## Laravel 5.1
Laravel 5.1 由 Laravel 5.0 改进而成,变更包括但是不限于:
* 采用 PSR-2 规范
* 支持添加事件广播
* 中间件参数
* Artisan 的改进等等。
### PHP 5.5.9+
由于 PHP 5.4 将在九月「结束寿命」,PHP 开发团队不再提供安全性更新,所以 Laravel 要求 PHP 5.5.9 或更高的版本。
PHP 5.5.9 同时也是最新版本的 PHP 函数库,像是 Guzzle 及 AWS SDK 需要的最小版本需要。
### LTS
Laravel 5.1 是 Laravel 生态系统中第一个 **长期支持** 版本。Laravel 5.1 会获得两年的 BUG 修复及三年的安全性修复,此策略也使 Laravel 能更好的服务于较大型的企业客户及消费者。
### PSR-2
[PSR-2 代码风格指南](https://phphub.org/topics/2079) 已经被 Laravel 框架采用为默认的代码风格指南。此外,所有的生成器都已进行更新,生成的文件将兼容 PSR-2 规范。
### 文档
Laravel 文档的每一页已被精心审阅,并得到显著的改善。所有的代码例子也进行了严密检查,使其有更高的上下文关联性。
### 事件广播
WebSockets 技术越来越多的被现代 Web 应用使用,当服务器上一些数据更新,WebSocket 会实时发送一个消息给客户端,实现即时更新用户状态功能。
Laravel 的事件广播机制很好的支持了此类应用的开发,广播事件允许服务器端代码和 JavaScript 框架间分享相同的事件名称。
了解更多关于事件广播,请查阅 [事件的文档](/docs/{{version}}/events#broadcasting-events)。
### 中间件参数
中间件支持接收自定义传参,例如要在运行特定操作之前,检查当前登录的用户是否具备「某角色」,可以创建 `RoleMiddleware` 来接收角色名称作为传参:
<?php
namespace App\Http\Middleware;
use Closure;
class RoleMiddleware
{
/**
* 运行请求过滤。
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string $role
* @return mixed
*/
public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
// 重定向...
}
return $next($request);
}
}
在路由中使用冒号 `:` 来区隔中间件名称与参数,多个参数可使用逗号作为分隔:
Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) {
//
}]);
关于中间件的更多信息,请查阅 [中间件的文档](/docs/{{version}}/middleware)。
### 测试改进
Laravel 内置的测试功能已得到显著的改善,新版本提供了简明的接口与应用程序进行交互,响应检查也变得更加轻松。
例如下方的测试:
public function testNewUserRegistration()
{
$this->visit('/register')
->type('Taylor', 'name')
->check('terms')
->press('Register')
->seePageIs('/dashboard');
}
关于测试的更多信息,请查阅 [测试的文档](/docs/{{version}}/testing)。
### 模型工厂
Laravel 的 [模型工厂](/docs/{{version}}/testing#model-factories) 提供一种简单的方式来创建仿真 Eloquent 模型。
在为 Eloquent 模型定义一组「默认」填充字段后,即可为测试,或者数据填充生成测试模型实例。
另外,模型工厂支持使用 [Faker](https://github.com/fzaninotto/Faker) 来生成随机数据:
$factory->define(App\User::class, function ($faker) {
return [
'name' => $faker->name,
'email' => $faker->email,
'password' => str_random(10),
'remember_token' => str_random(10),
];
});
更多关于模型工厂的信息,请查阅 [它的文档](/docs/{{version}}/testing#model-factories)。
### Artisan 的改进
Artisan 命令现支持类似于命名路由的定义,以简单易懂的形式来定义命令行的参数及选项。
举个例子,你可以定义一个简单的命令及它的参数和选项,如下:
/**
* 命令行的名字及署名。
*
* @var string
*/
protected $signature = 'email:send {user} {--force}';
更多关于定义 Artisan 命令的消息,请参考 [Artisan 的文档](/docs/{{version}}/artisan)。
### 文件夹结构
为了更方便理解,`app/Commands` 目录已经被更名为 `app/Jobs`。
此外,`app/Handler` 目录已经被合并成一个只包含事件侦听器的 `app/Listeners` 目录中。
这不是一个重大的改变,你不必更新成新的文件夹结构也能使用 Laravel 5.1。
### 加密
在 Laravel 之前的版本,加密是通过 `mcrypt` PHP 扩展进行处理。不过,从 Laravel 5.1 起,加密将采用更积极维护的 `openssl` 扩展进行处理。
<a name="laravel-5.0"></a>
## Laravel 5.0
Laravel 5.0 引进了新的应用程序架构。新架构允许 Laravel 创建更加健壮的应用程序,新架构全面采用新的自动加载标准(PSR-4)。
以下是一些主要变化:
### 新的目录结构
旧的 `app/models` 目录已经完全被移除。对应的,你所有的代码都放在 `app` 目录下。
默认情况下使用 `App` 命名空间。可以使用 `app:name` Artisan 命令对默认命名空间进行修改。
控制器、中间件,以及表单请求(Laravel 5.0 中新型态的类),分门别类的放在 `app/Http` 目录下,因为他们都与应用程序的 HTTP 传输层相关。除了一个路由设置的文件外,所有中间件现都分开为独自的类文件。
`app/Providers` 目录取代了旧版 Laravel 4.x `app/start` 里的文件。这些服务提供者为应用程序提供了各种引导功能,像是错误处理,日志纪录,路由加载等等。当然,你可以任意的创建新的服务提供者。
应用程序的语言文件和视图都被移到 `resources` 目录下。
### Contracts
所有 Laravel 组件实现所用的接口都放在 `illuminate/contracts` 文件夹中,他们没有其他依赖。这些方便集成的接口,让依赖注入变得低耦合,可简单作为 Laravel Facades 的替代选项。
更多关于 contracts 的信息,参考 [完整文档](/docs/{{version}}/contracts)。
### 路由缓存
如果你的应用程序全部使用控制器路由,新的 `route:cache` Artisan 命令可大幅度地优化路由注册寻找速度。
这对于拥有 100 个以上路由规则的应用程序来说很有用,可以 **大幅度地** 加快应用程序路由部分的处理速度。
### 路由中间件
除了像 Laravel 4 风格的路由「过滤器」,Laravel 5 现在有 HTTP 中间件,而原本的认证和 CSRF 「过滤器」已经改写成中间件。中间件提供了单个、一致的接口取代了各种过滤器,让你在请求进到应用程序前,可以简单地检查甚至拒绝请求。
更多关于中间件的信息,参考 [完整文档](/docs/{{version}}/middleware)。
### 控制器方法注入
除了之前有的类的构造函数注入外,你现在可以在控制器方法中使用依赖注入。[服务容器](/docs/{{version}}/container) 会自动注入依赖,即使路由包含了其它参数也不成问题:
public function createPost(Request $request, PostRepository $posts)
{
//
}
### 认证基本架构
认证系统默认包含了用户注册,认证,以及重设密码的控制器,还有对应的视图,视图文件存放在 `resources/views/auth`。
除此之外,「users」数据表迁移也默认包含在框架中。这些简单的资源,可以让你把心思放在产品开发上,而不用陷在编写认证模板的泥潭。
认证相关的视图可以通过 `auth/login` 以及 `auth/register` 路由访问。
`App\Services\Auth\Registrar` 会负责处理用户认证和注册用户的相关逻辑。
### 事件对象
你现在可以将事件定义成对象,而不是仅使用字符串。例:
<?php
class PodcastWasPurchased
{
public $podcast;
public function __construct(Podcast $podcast)
{
$this->podcast = $podcast;
}
}
这个事件可以像一般使用那样被派发:
Event::fire(new PodcastWasPurchased($podcast));
当然,你的事件处理会收到事件的对象而不是数据的列表:
<?php
class ReportPodcastPurchase
{
public function handle(PodcastWasPurchased $event)
{
//
}
}
更多关于使用事件的信息,参考 [完整文档](/docs/{{version}}/events)。
### 命令及队列
除了 Laravel 4 形式的队列任务,Laravel 5 还支持命令对象直接作为队列任务。这些命令放在 `app/Commands` 目录下。下面是个例子的命令:
<?php
class PurchasePodcast extends Command implements SelfHandling, ShouldBeQueued
{
use SerializesModels;
protected $user, $podcast;
/**
* Create a new command instance.
*
* @return void
*/
public function __construct(User $user, Podcast $podcast)
{
$this->user = $user;
$this->podcast = $podcast;
}
/**
* Execute the command.
*
* @return void
*/
public function handle()
{
// Handle the logic to purchase the podcast...
event(new PodcastWasPurchased($this->user, $this->podcast));
}
}
Laravel 的基底控制器使用了新的 `DispatchesCommands` trait,让你可以简单的派发命令运行:
$this->dispatch(new PurchasePodcastCommand($user, $podcast));
当然,你也可以将命令视为同步运行(而不会被放到队列里)的任务。事实上,「命令总线」是个不错的设计模式,可以封装应用程序需要运行的复杂任务。更多相关的信息,参考 [command bus](/docs/{{version}}/bus) 文档。
### 数据库队列
`database` 队列驱动现在已经包含在 Laravel 中了,提供了简单的本地端队列驱动,除了数据库相关软件外不需安装其它扩展包,完全开箱即用。
### Laravel 调度器
在过去,开发者是在 crontab 里配置任务调度的。然而,这是件很头痛的事情,因为你的命令行调度不在版本控制中,并且必须登录到服务器里才能添加新的 Cron 设置。
Laravel 命令行调度的存在,就是为了改变这一情况。
命令行调度系统让你在 Laravel 里定义富有表达性的命令调度,而且只需要在服务器里设置一个 Cron 设置即可。
看起来如下:
$schedule->command('artisan:command')->dailyAt('15:00');
参考 [完整文档](/docs/{{version}}/artisan#scheduling-artisan-commands) 学习所有调度相关知识。
### Tinker 与 Psysh
`php artisan tinker` 命令现在使用 Justin Hileman 的 [Psysh](https://github.com/bobthecow/psysh),一个 PHP 更强大的 REPL。如果你喜欢 Laravel 4 的 Boris,你也会喜欢上 Psysh。更好的是,它可以在 Windows 上运行!
赶快尝试下吧:
php artisan tinker
### DotEnv
比起一堆令人困惑的、嵌套的环境配置文件,Laravel 5 现在使用了 Vance Lucas 的 [DotEnv](https://github.com/vlucas/phpdotenv)。
这个扩展包提供了超级简单的方式管理配置文件,并且让 Laravel 5 环境侦测变得轻松。更多的细节,参考完整的 [配置文件文档](/docs/{{version}}/configuration#environment-configuration)。
### Laravel Elixir
Jeffrey Way 的 Laravel Elixir 提供了一个流畅、口语化的接口,可以编译以及合并静态资源。如果你曾经因为学习 Grunt 或 Gulp 而被吓到,不必再害怕了。Elixir 让使用 Gulp 编译 Less、Sass 及 CoffeeScript 变得简单。它甚至可以帮你运行测试!
更多关于 Elixir 的信息,参考 [完整文档](/docs/{{version}}/elixir)。
### Laravel Socialite
Laravel Socialite 是可选的,兼容 Laravel 5.0 以上的 OAuth 认证扩展包。目前 Socialite 支持 Facebook、Twitter、Google 以及 GitHub。它写起来是这样的:
public function redirectForAuth()
{
return Socialize::with('twitter')->redirect();
}
public function getUserFromProvider()
{
$user = Socialize::with('twitter')->user();
}
不再需要花上数小时编写 OAuth 的认证流程,只要几分钟!查看 [完整文档](/docs/{{version}}/authentication#social-authentication) 里有所有的细节。
### 文件系统集成
Laravel 现在包含了强大的 [Flysystem 文件系统](https://github.com/thephpleague/flysystem)(一个文件系统的抽象函数库)。
文件系统以抽象的概念,把本地端文件系统、Amazon S3 和 Rackspace 云存储集成在一起,统一且优雅的 API!
现在要将文件存到 Amazon S3 相当简单:
Storage::put('file.txt', 'contents');
更多关于 Laravel 文件系统集成,参考 [完整文档](/docs/{{version}}/filesystem)。
### Form Requests
Laravel 5.0 引进了 **form requests**,是继承自 `Illuminate\Foundation\Http\FormRequest` 的类。这些 request 对象可以和控制器方法依赖注入结合使用,提供一个不需模版的方法,来验证用户输入。让我们深入点,看一个 `FormRequest` 的例子:
<?php
namespace App\Http\Requests;
class RegisterRequest extends FormRequest
{
public function rules()
{
return [
'email' => 'required|email|unique:users',
'password' => 'required|confirmed|min:8',
];
}
public function authorize()
{
return true;
}
}
定义好类后,我们可以在控制器动作里使用类型提示进行依赖注入:
public function register(RegisterRequest $request)
{
var_dump($request->input());
}
当 Laravel 的服务容器辨别出要注入的类是个 `FormRequest` 实例,该请求将会被 **自动验证**。意味着,框架会自动根据你在 form request 类里自定的规则,对请求进行检验。当控制器动作调用时,你可以安全的假设 HTTP 的请求输入己被验证过。
甚至,若这个请求验证不通过,一个 HTTP 重定向(可以自定义),会自动发出,错误消息可以被闪存到 session 中或是转换成 JSON 返回。**表单验证再简单不过了。** 更多关于 `FormRequest` 验证,请参考 [文档](/docs/{{version}}/validation#form-request-validation)。
### 简易控制器请求验证
Laravel 5 基底控制器包含一个 `ValidatesRequests` trait。这个 trait 包含了一个简单的 `validate` 方法可以验证请求。如果对你的应用程序来说 `FormRequests` 太复杂了,可以考虑使用手动验证方法:
public function createPost(Request $request)
{
$this->validate($request, [
'title' => 'required|max:255',
'body' => 'required',
]);
}
如果验证失败,会抛出异常以及返回适当的 HTTP 响应到浏览器。验证错误信息会被闪存到 session 里!而如果请求是 AJAX 请求,Laravel 会自动返回 JSON 格式的验证错误信息。
更多关于这个新方法的信息,参考 [这个文档](/docs/{{version}}/validation#controller-validation)。
### 新的生成器
为了响应新的应用程序默认架构,框架新增了许多 Artisan generator 命令。使用 `php artisan list` 查看完整的命令列表。
### 配置文件缓存
你现在可以通过 `config:cache` 命令将所有的配置文件缓存在单个文件中,这样在一定程度上会加快框架的启动效率。
### Symfony VarDumper
广为使用的 `dd` 辅助函数,用作在调试时输出变量信息,现采用令人惊艳的 Symfony VarDumper 扩展包。它提供了颜色标记的输出,甚至数组可以自动缩合。在项目中试试下列代码:
dd([1, 2, 3]);
<a name="laravel-4.2"></a>
## Laravel 4.2
此发行版本的完整的变更列表可以通过运行 `php artisan changes` 命令来获取,或者 [Github 上的更动纪录](https://github.com/laravel/framework/blob/4.2/src/Illuminate/Foundation/changes.json)。此纪录仅含括主要更新和此发行的更动部分。
> **附注:** 在 4.2 开发期间,许多小的 BUG 修正与功能强化被整合至各个 4.1 的子发行版本中。所以,也请一并检查 Laravel 4.1 版本的更新列表。
### PHP 5.4 需求
Laravel 4.2 需要 PHP 5.4 以上的版本。此 PHP 更新版本让我们可以使用 PHP 的新功能:traits 来为像是 [Laravel 收银台](/docs/billing) 来提供更具表达力的接口。PHP 5.4 也比 PHP 5.3 带来显著的速度及性能提升。
### Laravel Forge
Larvel Forge,一个网页应用程序,提供一个简单的接口让你创建管理云端上的 PHP 服务器,像是 Linode、DigitalOcean、Rackspace 和 Amazon EC2。
支持自动化 nginx 设置、SSH 密钥管理、Cron job 自动化、通过 NewRelic & Papertrail 服务器监控、「推送部署」、Laravel queue worker 设置等等。Forge 提供最简单且更实惠的方式来部署所有你的 Laravel 应用程序。
默认 Laravel 4.2 的安装里,`app/config/database.php` 配置文件已为 Forge 设置完成,让你更方便的完成新平台上的全新应用程序的部署。
关于 Laravel Forge 的更多信息可以在 [官方 Forge 网站](https://forge.laravel.com) 上找到。
### Laravel Homestead
Laravel Homestead 是一个健全的 Laravel 和 PHP 应用程序 Vagrant 环境。软件依赖都已提前准备好,可以极快的被启用。
Homestead 包含 Nginx 1.6、PHP 5.5.12、MySQL、Postres、Redis、Memcached、Beanstalk、Node、Gulp、Grunt 和 Bower。Homestead 包含一个简单的 `Homestead.yaml` 配置文件,允许你在单个封装包中管理多个 Laravel 应用程序。
默认的 Laravel 4.2 安装中包含的 `app/config/local/database.php` 配置文件已经为你配置好了 Homestead 的数据库连接。让 Laravel 初始化安装与设置更为方便。
官方文档已经更新并包含在 [Homestead 文档](/docs/homestead) 中。
### Laravel 收银台
Laravel 收银台是一个简单、具表达性的资源库,用来管理 Stripe 的订阅服务。虽然安装此组件是可选的,我们仍然将收银台文档包含在主要 Laravel 文档中。新版本的收银台带来了数个错误修正、多货币支持还有支持了最新的 Stripe API。
### Queue Workers 常驻程序
Artisan `queue:work` 命令现在支持 `--daemon` 参数让 worker 可以作为「常驻程序」启用。代表 worker 可以持续的处理队列工作,而不需要重启框架。这让一个复杂的应用程序对 CPU 的使用率有显著的降低。
更多关于 Queue Workers 常驻程序信息请详阅 [queue 文档](/docs/queues#daemon-queue-worker)。
### Mail API Drivers
Laravel 4.2 为 `Mail` 类采用了新的 Mailgun 和 Mandrill API 驱动。对许多应用程序而言,他提供了比 SMTP 更快也更可靠的方法来递送邮件。新的驱动使用了 Guzzle 4 HTTP 资源库。
### 软删除 Traits
PHP 5.4 的 `traits` 提供了一个更加简洁的软删除架构和全局作用域,这些新架构为框架提供了更有扩展性的功能,并且让框架更加简洁。
更多关于软删除的文档请见: [Eloquent documentation](/docs/eloquent#soft-deleting)。
### 更为方便的 认证(auth) & Remindable Traits
得益于 PHP 5.4 traits,我们有了一个更简洁的用户认证和密码提醒接口,这也让 `User` 模型文档更加精简。
### "简易分页"
一个新的 `simplePaginate` 方法已被加入到查找以及 Eloquent 查找器中。让你在分页视图中,使用简单的「上一页」和「下一页」链接查找更为高效。
### 迁移确认
在正式环境中,破坏性的迁移动作将会被再次确认。如果希望取消提示字符确认请使用 `--force` 参数。
<a name="laravel-4.1"></a>
## Laravel 4.1
### 完整更动列表
此发行版本的完整更动列表,可以在版本 4.1 的安装中命令行运行 `php artisan changes` 获取,或者浏览 [Github 更新文件中](https://github.com/laravel/framework/blob/4.1/src/Illuminate/Foundation/changes.json) 中了解。其中只记录了该版本比较主要的强化功能和更动。
### 新的 SSH 组件
一个全新的 `SSH` 组件在此发行版本中登场。此功能让你可以轻易的 SSH 至远程服务器并运行命令。更多信息,可以参阅 [SSH 组件文档](/docs/ssh)。
新的 `php artisan tail` 命令就是使用这个新的 SSH 组件。更多的信息,请参阅 `tail` [命令集文档](http://laravel.com/docs/ssh#tailing-remote-logs)。
### Boris In Tinker
如果你的系统支持 [Boris REPL](https://github.com/d11wtq/boris),`php artisan thinker` 命令将会使用到它。系统中也必须先行安装好 `readline` 和 `pcntl` 两个 PHP 扩展包。如果你没这些扩展包,从 4.0 之后将会使用到它。
### Eloquent 强化
Eloquent 添加了新的 `hasManyThrough` 关系链。想要了解更多,请参见 [Eloquent 文档](/docs/eloquent#has-many-through)。
一个新的 `whereHas` 方法也同时登场,他将允许 [检索基于关系模型](/docs/eloquent#querying-relations)。
### 数据库读写分离
Query Builder 和 Eloquent 目前通过数据库层,已经可以自动做到读写分离。更多的信息,请参考 [文档](/docs/database#read-write-connections)。
### 队列排序
队列排序已经被支持,只要在 `queue:listen` 命令后将队列以逗号分隔送出。
### 失败队列作业处理
现在队列将会自动处理失败的作业,只要在 `queue:listen` 后加上 `--tries` 即可。更多的失败作业处理可以参见 [队列文档](/docs/queues#failed-jobs)。
### 缓存标签
缓存「区块」已经被「标签」取代。缓存标签允许你将多个「标签」指向同一个缓存对象,而且可以清空所有被指定某个标签的所有对象。更多使用缓存标签信息请见 [缓存文档](/docs/cache#cache-tags)。
### 更具弹性的密码提醒
密码提醒引擎已经可以提供更强大的开发弹性,如:认证密码、显示状态消息等等。使用强化的密码提醒引擎,更多的信息 [请参阅文档](/docs/security#password-reminders-and-reset)。
### 强化路由引擎
Laravel 4.1 拥有一个完全重新编写的路由层。API 一样不变。然而与 4.0 相比,速度快上 100%。整个引擎大幅的简化,且路由表达式大大减少对 Symfony Routing 的依赖。
### 强化 Session 引擎
此发行版本中,我们亦发布了全新的 Session 引擎。如同路由增进的部分,新的 Session 层更加简化且更快速。我们不再使用 Symfony 的 Session 处理工具,并且使用更简单、更容易维护的自定义解法。
### Doctrine DBAL
如果你有在你的迁移中使用到 `renameColumn`,之后你必须在 `composer.json` 里加 `doctrine/dbal` 进依赖扩展包中。此扩展包不再默认包含在 Laravel 之中。
- 说明
- 翻译说明
- 发行说明
- 升级说明
- 贡献导引
- 入门指南
- 安装
- 配置信息
- 文件夹结构
- 错误与日志
- 开发环境
- HomeStead
- Valet
- 核心概念
- 服务容器
- 服务提供者
- 门面(facades)
- contracts
- HTTP层
- 路由
- 中间件
- CSRF保护
- 控制器
- 请求
- 响应
- Session
- 表单验证
- 视图与模板
- 视图
- Blade模板
- 本地化
- Javascript与CSS
- 入门指南
- laravel-elixir
- 安全
- 用户认证
- 用户授权
- 重置密码
- API授权
- 加密解密
- 哈希
- 综合话题
- 广播系统
- 缓存系统
- 事件系统
- 文件存储
- 邮件发送
- 消息通知
- 队列
- 数据库
- 快速入门
- 查询构造器
- 分页
- 数据库迁移
- 数据填充
- redis
- Eloquent ORM
- 快速入门
- 模型关联
- Eloquent集合
- 修改器
- 序列化
- Artisan控制台
- Artisan 命令行
- 任务调度
- 测试
- 快速入门
- 应用程序测试
- 数据库测试
- 模拟器
- 官方扩展包
- Cashier交易包
- Envoy 部署工具
- Passport OAuth 认证
- Scout 全文搜索
- Socialite 社交化登录
- 附录
- 集合
- 辅助函数
- 扩展包开发
- 交流说明