发行说明
支持策略
Laravel 5.1 LTS 版本会提供两年的 BUG 修复及三年的安全性修复,LTS 版本是 Laravel 能提供的维护时间最长的发行版。
对于一般的版本,会提供六个月的 BUG 修复及一年的安全性修复。
译者注:扩展阅读 - Laravel 的发布路线图
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 路由模型绑定部分。
中间件组
中间件组允许你使用单个 键
对相关路由中间件进行分组,从而实现为某个路由一次性指定多个中间件。例如,在同一个应用中同时构建 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 文档.
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 改进而成,变更包括但是不限于:
- 采用 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 代码风格指南 已经被 Laravel 框架采用为默认的代码风格指南。此外,所有的生成器都已进行更新,生成的文件将兼容 PSR-2 规范。
文档
Laravel 文档的每一页已被精心审阅,并得到显著的改善。所有的代码例子也进行了严密检查,使其有更高的上下文关联性。
事件广播
WebSockets 技术越来越多的被现代 Web 应用使用,当服务器上一些数据更新,WebSocket 会实时发送一个消息给客户端,实现即时更新用户状态功能。
Laravel 的事件广播机制很好的支持了此类应 用的开发,广播事件允许服务器端代码和 JavaScript 框架间分享相同的事件名称。
了解更多关于事件广播,请查阅 事件的文档。
中间件参数
中间件支持接收自定义传参,例如要在运行特定操作之前,检查当前登录的用户是否具备「某角色」,可以创建 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) {
//
}]);
关于中间件的更多信息,请查阅 中间件的文档。
测试改进
Laravel 内置的测试功能已得到显著的改善,新版本提供了简明的接口与应用程序进行交互,响应检查也变得更加轻松。
例如下方的测试:
public function testNewUserRegistration()
{
$this->visit('/register')
->type('Taylor', 'name')
->check('terms')
->press('Register')
->seePageIs('/dashboard');
}
关于测试的更多信息,请查阅 测试的文档。
模型工厂
Laravel 的 模型工厂 提供一种简单的方式来创建仿真 Eloquent 模型。
在为 Eloquent 模型定义一组「默认」填充字段后,即可为测试,或者数据填充生成测试模型实例。
另外,模型工厂支持使用 Faker 来生成随机数据:
$factory->define(App\User::class, function ($faker) {
return [
'name' => $faker->name,
'email' => $faker->email,
'password' => str_random(10),
'remember_token' => str_random(10),
];
});
更多关于模型工厂的信息,请查阅 它的文档。
Artisan 的改进
Artisan 命令现支持类似于命名路由的定义,以简单易懂的形式来定义命令行的参数及选项。
举个例子,你可以定义一个简单的命令及它的参数和选项,如下:
/**
* 命令行的名字及署名。
*
* @var string
*/
protected $signature = 'email:send {user} {--force}';
更多关于定义 Artisan 命令的消息,请参考 Artisan 的文档。
文件夹结构
为了更方便理解,app/Commands
目录已经被更名为 app/Jobs
。
此外,app/Handler
目录已经被合并成一个只包含事件侦听器的 app/Listeners
目录中。
这不是一个重大的改变,你不必更新成新的文件夹结构也能使用 Laravel 5.1。
加密
在 Laravel 之前的版本,加密是通过 mcrypt
PHP 扩展进行处理。不过,从 Laravel 5.1 起,加密将采用更积极维护的 openssl
扩展进行处理。
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 的信息,参考 完整文档。
路由缓存
如果你的应用程序全部使用控制器路由,新的 route:cache
Artisan 命令可大幅度地优化路由注册寻找速度。
这对于拥有 100 个以上路由规则的应用程序来说很有用,可以 大幅度地 加快应用程序路由部分的处理速度。
路由中间件
除了像 Laravel 4 风格的路由「过滤器」,Laravel 5 现在有 HTTP 中间件,而原本的认证和 CSRF 「过滤器」已经改写成中间件。中间件提供了单个、一致的接口取代了各种过滤器,让你在请求进到应用程序前,可以简单地检查甚至拒绝请求。
更多关于中间件的信息,参考 完整文档。
控制器方法注入
除了之前有的类的构造函数注入外,你现在可以在控制器方法中使用依赖注入。服务容器 会自动注入依赖,即使路由包含了其它参数也不成问题:
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)
{
//
}
}