Skip to content

发布说明

版本方案

Laravel 的版本方案遵循以下惯例:paradigm.minor.patch。小版本框架每六个月发布一次(1 月和 7 月),而补丁版本可能每周发布一次。补丁版本绝不应包含破坏性更改。

在从应用程序或包中引用 Laravel 框架或其组件时,您应始终使用诸如 5.4.* 之类的版本约束,因为 Laravel 的小版本确实包含破坏性更改。但是,我们努力确保您可以在一天或更短的时间内更新到新的小版本。

范式转换版本相隔多年,代表框架架构和约定的根本性变化。目前,没有正在开发的范式转换版本。

为什么 Laravel 不使用语义版本控制?

一方面,Laravel 的所有可选组件(Cashier、Dusk、Valet、Socialite 等)确实使用语义版本控制。然而,Laravel 框架本身并没有。原因是语义版本控制是一种“还原主义”的方法,用于确定两段代码是否兼容。即使使用语义版本控制,您仍然必须安装升级后的包并运行自动化测试套件,以了解是否有任何与代码库实际不兼容的地方。

因此,Laravel 框架使用一种更能传达发布范围的版本方案。此外,由于补丁版本绝不包含故意的破坏性更改,只要您的版本约束遵循 paradigm.minor.* 约定,您就不应收到破坏性更改。

支持政策

对于 LTS 版本,例如 Laravel 5.1,提供 2 年的错误修复和 3 年的安全修复。这些版本提供最长的支持和维护窗口。对于一般版本,提供 6 个月的错误修复和 1 年的安全修复。

Laravel 5.4.22

Laravel 5.4.22 修补了 Laravel 5.4 发布系列中的一个安全漏洞,该漏洞允许对应用程序用户进行网络钓鱼攻击。使用密码重置系统,恶意用户可以尝试诱骗您的用户将其登录凭据输入到他们控制的单独应用程序中。由于密码重置通知使用传入请求的主机来构建密码重置 URL,因此密码重置 URL 的主机可能会被欺骗。如果用户没有注意到他们不在预期应用程序的域上,他们可能会不小心将其登录凭据输入到恶意应用程序中。

在 Laravel 5.1 应用程序中,密码重置通知由开发人员维护,因此此漏洞可能存在也可能不存在。您应该验证您的应用程序是否为密码重置链接生成了绝对 URL:

php
{{ url('http://example.com/password/reset/'.$token) }}

Laravel 5.4

Laravel 5.4 继续改进 Laravel 5.3,通过添加对基于 Markdown 的电子邮件和通知Laravel Dusk 浏览器自动化和测试框架、Laravel Mix、Blade“组件”和“插槽”、广播频道上的路由模型绑定、集合的高阶消息、基于对象的 Eloquent 事件、作业级别的“重试”和“超时”设置、“实时”外观、对 Redis 集群的改进支持、自定义枢纽表模型、请求输入修剪和清理的中间件等的支持。此外,框架的整个代码库已被审查和重构以提高整体清洁度。

lightbulb

本文档总结了框架的最显著改进;然而,更详细的变更日志始终可在 GitHub 上找到。

Markdown 邮件和通知

laracast

有关此功能的免费视频教程可在 Laracasts 上找到。

Markdown 可邮寄消息允许您在邮件中利用邮件通知的预构建模板和组件。由于消息是用 Markdown 编写的,Laravel 能够为消息渲染美观、响应式的 HTML 模板,同时还自动生成纯文本副本。例如,Markdown 电子邮件可能如下所示:

php
@component('mail::message')
# 订单已发货

您的订单已发货!

@component('mail::button', ['url' => $url])
查看订单
@endcomponent

下一步:

- 在我们的网站上跟踪您的订单
- 预签收

谢谢,<br>
{{ config('app.name') }}
@endcomponent

使用这个简单的 Markdown 模板,Laravel 能够生成响应式 HTML 电子邮件和纯文本副本:

要了解有关 Markdown 邮件和通知的更多信息,请查看完整的邮件通知文档。

lightbulb

您可以将所有 Markdown 邮件组件导出到您自己的应用程序中进行自定义。要导出组件,请使用 vendor:publish Artisan 命令发布 laravel-mail 资产标签。

Laravel Dusk

laracast

有关此功能的免费视频教程可在 Laracasts 上找到。

Laravel Dusk 提供了一种表达性强、易于使用的浏览器自动化和测试 API。默认情况下,Dusk 不需要您在机器上安装 JDK 或 Selenium。相反,Dusk 使用独立的 ChromeDriver 安装。但是,您可以自由使用任何其他兼容 Selenium 的驱动程序。

由于 Dusk 使用真实浏览器操作,您可以轻松测试和与大量使用 JavaScript 的应用程序进行交互:

php
/**
 * 一个基本的浏览器测试示例。
 *
 * @return void
 */
public function testBasicExample()
{
    $user = factory(User::class)->create([
        'email' => 'taylor@laravel.com',
    ]);

    $this->browse(function ($browser) use ($user) {
        $browser->loginAs($user)
                ->visit('/home')
                ->press('Create Playlist')
                ->whenAvailable('.playlist-modal', function ($modal) {
                    $modal->type('name', 'My Playlist')
                          ->press('Create');
                });

        $browser->waitForText('Playlist Created');
    });
}

有关 Dusk 的更多信息,请查阅完整的 Dusk 文档

Laravel Mix

laracast

有关此功能的免费视频教程可在 Laracasts 上找到。

Laravel Mix 是 Laravel Elixir 的精神继承者,完全基于 Webpack 而不是 Gulp。Laravel Mix 提供了一种流畅的 API,用于使用几种常见的 CSS 和 JavaScript 预处理器为您的 Laravel 应用程序定义 Webpack 构建步骤。通过简单的方法链,您可以流畅地定义资产管道。例如:

php
mix.js('resources/assets/js/app.js', 'public/js')
   .sass('resources/assets/sass/app.scss', 'public/css');

Blade 组件和插槽

laracast

有关此功能的免费视频教程可在 Laracasts 上找到。

Blade 组件和插槽提供了与部分和布局类似的好处;然而,有些人可能会发现组件和插槽的心理模型更容易理解。首先,让我们想象一个我们希望在整个应用程序中重用的可重用“警报”组件:

php
<!-- /resources/views/alert.blade.php -->

<div class="alert alert-danger">
    {{ $slot }}
</div>

{{ $slot }} 变量将包含我们希望注入组件的内容。现在,要构建此组件,我们可以使用 @component Blade 指令:

php
@component('alert')
    <strong>哎呀!</strong> 出了点问题!
@endcomponent

命名插槽允许您将多个插槽提供给单个组件:

php
<!-- /resources/views/alert.blade.php -->

<div class="alert alert-danger">
    <div class="alert-title">{{ $title }}</div>

    {{ $slot }}
</div>

命名插槽可以使用 @slot 指令注入。任何不在 @slot 指令中的内容都将传递给组件中的 $slot 变量:

php
@component('alert')
    @slot('title')
        禁止
    @endslot

    您无权访问此资源!
@endcomponent

要了解有关组件和插槽的更多信息,请查阅完整的 Blade 文档

广播模型绑定

就像 HTTP 路由一样,频道路由现在可以利用隐式和显式路由模型绑定。例如,您可以请求实际的 Order 模型实例,而不是接收字符串或数字订单 ID:

php
use App\Order;

Broadcast::channel('order.{order}', function ($user, Order $order) {
    return $user->id === $order->user_id;
});

要了解有关广播模型绑定的更多信息,请查阅完整的事件广播文档。

集合高阶消息

laracast

有关此功能的免费视频教程可在 Laracasts 上找到。

集合现在提供对“高阶消息”的支持,这些是用于在集合上执行常见操作的快捷方式。提供高阶消息的集合方法有:containseacheveryfilterfirstmappartitionrejectsortBysortByDescsum

每个高阶消息都可以作为集合实例上的动态属性访问。例如,让我们使用 each 高阶消息在集合中的每个对象上调用一个方法:

php
$users = User::where('votes', '>', 500)->get();

$users->each->markAsVip();

同样,我们可以使用 sum 高阶消息来收集用户集合的“投票”总数:

php
$users = User::where('group', 'Development')->get();

return $users->sum->votes;

基于对象的 Eloquent 事件

laracast

有关此功能的免费视频教程可在 Laracasts 上找到。

Eloquent 事件处理程序现在可以映射到事件对象。这提供了一种更直观的方式来处理 Eloquent 事件,并使测试事件变得更容易。要开始,请在 Eloquent 模型上定义一个 $events 属性,将 Eloquent 模型生命周期的各个点映射到您自己的事件类

php
<?php

namespace App;

use App\Events\UserSaved;
use App\Events\UserDeleted;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * 模型的事件映射。
     *
     * @var array
     */
    protected $events = [
        'saved' => UserSaved::class,
        'deleted' => UserDeleted::class,
    ];
}

作业级别的重试和超时

以前,队列作业的“重试”和“超时”设置只能在命令行上全局配置所有作业。然而,在 Laravel 5.4 中,这些设置可以通过直接在作业类上定义来按作业配置:

php
<?php

namespace App\Jobs;

class ProcessPodcast implements ShouldQueue
{
    /**
     * 作业可以尝试的次数。
     *
     * @var int
     */
    public $tries = 5;

    /**
     * 作业可以运行的秒数,超过此时间将超时。
     *
     * @var int
     */
    public $timeout = 120;
}

有关这些设置的更多信息,请查阅完整的队列文档

请求清理中间件

laracast

有关此功能的免费视频教程可在 Laracasts 上找到。

Laravel 5.4 在默认中间件堆栈中包含两个新中间件:TrimStringsConvertEmptyStringsToNull

php
/**
 * 应用程序的全局 HTTP 中间件堆栈。
 *
 * 这些中间件在每个请求进入应用程序时运行。
 *
 * @var array
 */
protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

这些中间件将自动修剪请求输入值并将任何空字符串转换为 null。这有助于您规范化进入应用程序的每个请求的输入,而不必担心在每个路由和控制器中不断调用 trim 函数。

“实时”外观

laracast

有关此功能的免费视频教程可在 Laracasts 上找到。

以前,只有 Laravel 自己的内置服务公开了外观,这些外观通过服务容器提供对其方法的快速、简洁的访问。然而,在 Laravel 5.4 中,您可以通过简单地在导入的类名之前加上 Facades 前缀,轻松地将应用程序中的任何类转换为实时外观。例如,假设您的应用程序包含如下类:

php
<?php

namespace App\Services;

class PaymentGateway
{
    protected $tax;

    /**
     * 创建一个新的支付网关实例。
     *
     * @param  TaxCalculator  $tax
     * @return void
     */
    public function __construct(TaxCalculator $tax)
    {
        $this->tax = $tax;
    }

    /**
     * 支付给定金额。
     *
     * @param  int  $amount
     * @return void
     */
    public function pay($amount)
    {
        // 支付金额...
    }
}

您可以轻松地将此类用作外观,如下所示:

php
use Facades\ {
    App\Services\PaymentGateway
};

Route::get('/pay/{amount}', function ($amount) {
    PaymentGateway::pay($amount);
});

当然,如果您以这种方式利用实时外观,您可以轻松地使用 Laravel 的外观模拟功能为交互编写测试:

php
PaymentGateway::shouldReceive('pay')->with('100');

自定义枢纽表模型

在 Laravel 5.3 中,belongsToMany 关系的所有“枢纽”表模型都使用相同的内置 Pivot 模型实例。在 Laravel 5.4 中,您可以为枢纽表定义自定义模型。如果您希望定义一个自定义模型来表示关系的中间表,请在定义关系时使用 using 方法:

php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    /**
     * 属于角色的用户。
     */
    public function users()
    {
        return $this->belongsToMany('App\User')->using('App\UserRole');
    }
}

改进的 Redis 集群支持

以前,在同一应用程序中定义到单个主机和集群的 Redis 连接是不可能的。在 Laravel 5.4 中,您现在可以在同一应用程序中定义到多个单个主机和多个集群的 Redis 连接。有关 Laravel 中 Redis 的更多信息,请查阅完整的 Redis 文档

迁移默认字符串长度

Laravel 5.4 默认使用 utf8mb4 字符集,其中包括对在数据库中存储“表情符号”的支持。如果您正在从 Laravel 5.3 升级应用程序,则无需切换到此字符集。

如果您选择手动切换到此字符集并且运行的 MySQL 版本低于 5.7.7,您可能需要手动配置迁移生成的默认字符串长度。您可以通过在 AppServiceProvider 中调用 Schema::defaultStringLength 方法来配置此项:

php
use Illuminate\Support\Facades\Schema;

/**
 * 启动任何应用程序服务。
 *
 * @return void
 */
public function boot()
{
    Schema::defaultStringLength(191);
}

Laravel 5.3

Laravel 5.3 继续改进 Laravel 5.2,通过添加基于驱动的通知系统、通过 Laravel Echo 提供的强大实时支持、通过 Laravel Passport 提供的无痛 OAuth2 服务器、通过 Laravel Scout 提供的全文模型搜索、Laravel Elixir 中的 Webpack 支持、“可邮寄”对象、webapi 路由的显式分离、基于闭包的控制台命令、存储上传文件的便捷助手、对 POPO 和单动作控制器的支持、改进的默认前端脚手架等。

通知

laracast

有关此功能的免费视频教程可在 Laracasts 上找到。

Laravel 通知提供了一种简单、表达式丰富的 API,用于通过多种传递渠道(如电子邮件、Slack、SMS 等)发送通知。例如,您可以定义一条通知,通知发票已支付,并通过电子邮件和 SMS 发送该通知。然后,您可以使用一个简单的方法发送通知:

php
$user->notify(new InvoicePaid($invoice));

已经有多种社区编写的驱动程序用于通知,包括对 iOS 和 Android 通知的支持。要了解有关通知的更多信息,请务必查看完整的通知文档

WebSockets / 事件广播

虽然事件广播在 Laravel 的早期版本中已经存在,但 Laravel 5.3 版本大大改进了框架的这一功能,增加了对私有和存在 WebSocket 频道的频道级别身份验证:

php
/*
 * 验证频道订阅...
 */
Broadcast::channel('orders.*', function ($user, $orderId) {
    return $user->placedOrder($orderId);
});

Laravel Echo 是一个可通过 NPM 安装的新 JavaScript 包,提供了一种简单、美观的 API,用于在客户端 JavaScript 应用程序中订阅频道并监听服务器端事件。Echo 支持 PusherSocket.io

php
Echo.channel('orders.' + orderId)
    .listen('ShippingStatusUpdated', (e) => {
        console.log(e.description);
    });

除了订阅传统频道,Laravel Echo 还使订阅提供有关谁在给定频道上收听的信息的存在频道变得轻而易举:

php
Echo.join('chat.' + roomId)
    .here((users) => {
        //
    })
    .joining((user) => {
        console.log(user.name);
    })
    .leaving((user) => {
        console.log(user.name);
    });

要了解有关 Echo 和事件广播的更多信息,请查看完整的文档

Laravel Passport (OAuth2 服务器)

laracast

有关此功能的免费视频教程可在 Laracasts 上找到。

Laravel 5.3 使 API 身份验证变得轻而易举,使用 Laravel Passport 可以在几分钟内为您的 Laravel 应用程序提供完整的 OAuth2 服务器实现。Passport 构建在由 Alex Bilbie 维护的 League OAuth2 服务器之上。

Passport 使通过 OAuth2 授权代码发放访问令牌变得轻而易举。您还可以允许用户通过 Web UI 创建“个人访问令牌”。为了让您快速入门,Passport 包含 Vue 组件,可以作为您的 OAuth2 仪表板的起点,允许用户创建客户端、撤销访问令牌等:

php
<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 时可能请求的访问令牌范围变得简单:

php
Passport::tokensCan([
    'place-orders' => 'Place new orders',
    'check-status' => 'Check order status',
]);

此外,Passport 包含用于验证访问令牌身份验证请求是否包含必要令牌范围的有用中间件:

php
Route::get('/orders/{order}/status', function (Order $order) {
    // 访问令牌具有“check-status”范围...
})->middleware('scope:check-status');

最后,Passport 包括支持从 JavaScript 应用程序消费您自己的 API,而无需担心传递访问令牌。Passport 通过加密的 JWT cookie 和同步的 CSRF 令牌实现这一点,让您专注于重要的事情:您的应用程序。有关 Passport 的更多信息,请务必查看其完整文档

搜索 (Laravel Scout)

Laravel Scout 为您的 Eloquent 模型 添加全文搜索提供了一种简单、基于驱动的解决方案。使用模型观察者,Scout 将自动保持搜索索引与 Eloquent 记录同步。目前,Scout 附带一个 Algolia 驱动程序;然而,编写自定义驱动程序很简单,您可以自由扩展 Scout 以实现自己的搜索实现。

使模型可搜索就像在模型中添加一个 Searchable trait 一样简单:

php
<?php

namespace App;

use Laravel\Scout\Searchable;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use Searchable;
}

一旦将 trait 添加到模型中,只需保存模型即可保持其信息与搜索索引同步:

php
$order = new Order;

// ...

$order->save();

一旦模型被索引,您可以轻松地在所有模型中执行全文搜索。您甚至可以分页搜索结果:

php
return Order::search('Star Trek')->get();

return Order::search('Star Trek')->where('user_id', 1)->paginate();

当然,Scout 还有许多其他功能,这些功能在完整文档中进行了介绍。

可邮寄对象

laracast

有关此功能的免费视频教程可在 Laracasts 上找到。

Laravel 5.3 附带对可邮寄对象的支持。这些对象允许您将电子邮件消息表示为简单对象,而不是在闭包中自定义邮件消息。例如,您可以为“欢迎”电子邮件定义一个简单的可邮寄对象:

php
class WelcomeMessage extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * 构建消息。
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.welcome');
    }
}

一旦定义了可邮寄对象,您可以使用简单、表达式丰富的 API 将其发送给用户。可邮寄对象非常适合在扫描代码时发现消息的意图:

php
Mail::to($user)->send(new WelcomeMessage);

当然,您还可以将可邮寄对象标记为“可排队”,以便它们由队列工作者在后台发送:

php
class WelcomeMessage extends Mailable implements ShouldQueue
{
    //
}

有关可邮寄对象的更多信息,请务必查看邮件文档

存储上传文件

laracast

有关此功能的免费视频教程可在 Laracasts 上找到。

在 Web 应用程序中,存储文件的最常见用例之一是存储用户上传的文件,例如个人资料图片、照片和文档。Laravel 5.3 使使用上传文件实例上的新 store 方法存储上传文件变得非常容易。只需调用 store 方法并指定要存储上传文件的路径:

php
/**
 * 更新用户的头像。
 *
 * @param  Request  $request
 * @return Response
 */
public function update(Request $request)
{
    $path = $request->file('avatar')->store('avatars', 's3');

    return $path;
}

有关存储上传文件的更多信息,请查看完整文档

Webpack 和 Laravel Elixir

随着 Laravel 5.3 的发布,Laravel Elixir 6.0 已经发布,内置对 Webpack 和 Rollup JavaScript 模块打包器的支持。默认情况下,Laravel 5.3 的 gulpfile.js 文件现在使用 Webpack 来编译 JavaScript。完整的 Laravel Elixir 文档包含有关这两个打包器的更多信息:

php
elixir(mix => {
    mix.sass('app.scss')
       .webpack('app.js');
});

前端结构

laracast

有关此功能的免费视频教程可在 Laracasts 上找到。

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 框架。有关如何开始使用现代 Laravel 前端开发的更多信息,请查看新的前端文档介绍

路由文件

默认情况下,新的 Laravel 5.3 应用程序在新的顶级 routes 目录中包含两个 HTTP 路由文件。webapi 路由文件为如何将 Web 界面和 API 的路由分开提供了更明确的指导。api 路由文件中的路由由 RouteServiceProvider 自动分配 api 前缀。

闭包控制台命令

除了可以定义为命令类之外,Artisan 命令现在可以在 app/Console/Kernel.php 文件的 commands 方法中定义为简单的闭包。在新的 Laravel 5.3 应用程序中,commands 方法加载一个 routes/console.php 文件,该文件允许您将控制台命令定义为类似路由的、基于闭包的入口点:

php
Artisan::command('build {project}', function ($project) {
    $this->info('Building project...');
});

有关闭包命令的更多信息,请查看完整的 Artisan 文档

$loop 变量

laracast

有关此功能的免费视频教程可在 Laracasts 上找到。

在 Blade 模板中循环时,$loop 变量将在循环内部可用。此变量提供了一些有用的信息,例如当前循环索引以及这是否是循环的第一次或最后一次迭代:

php
@foreach ($users as $user)
    @if ($loop->first)
        这是第一次迭代。
    @endif

    @if ($loop->last)
        这是最后一次迭代。
    @endif

    <p>这是用户 {{ $user->id }}</p>
@endforeach

有关更多信息,请查阅完整的 Blade 文档

Laravel 5.2

Laravel 5.2 继续改进 Laravel 5.1,通过添加多重身份验证驱动程序支持、隐式模型绑定、简化的 Eloquent 全局作用域、可选的身份验证脚手架、中间件组、速率限制中间件、数组验证改进等。

身份验证驱动程序 / “多重身份验证”

在 Laravel 的早期版本中,只有默认的基于会话的身份验证驱动程序支持开箱即用,并且每个应用程序不能有多个可认证的模型实例。

然而,在 Laravel 5.2 中,您可以定义其他身份验证驱动程序,并定义多个可认证的模型或用户表,并分别控制它们的身份验证过程。例如,如果您的应用程序有一个用于“管理员”用户的数据库表和一个用于“学生”用户的数据库表,您现在可以使用 Auth 方法分别对每个表进行身份验证。

身份验证脚手架

Laravel 已经使处理后端身份验证变得容易;然而,Laravel 5.2 提供了一种方便、快速的方式来为前端生成身份验证视图。只需在终端上执行 make:auth 命令:

php
php artisan make:auth

此命令将为用户登录、注册和密码重置生成简单的、与 Bootstrap 兼容的视图。该命令还将使用适当的路由更新您的路由文件。

exclamation

此功能仅用于新应用程序,而不是在应用程序升级期间使用。

隐式模型绑定

隐式模型绑定使将相关模型直接注入到路由和控制器中变得轻而易举。例如,假设您定义了如下路由:

php
use App\User;

Route::get('/user/{user}', function (User $user) {
    return $user;
});

在 Laravel 5.1 中,您通常需要使用 Route::model 方法来指示 Laravel 注入与路由定义中的 {user} 参数匹配的 App\User 实例。然而,在 Laravel 5.2 中,框架将自动根据 URI 段注入此模型,使您能够快速访问所需的模型实例。

当路由参数段({user})与路由闭包或控制器方法的相应变量名($user)匹配并且变量是 Eloquent 模型类的类型提示时,Laravel 将自动注入模型。

中间件组

中间件组允许您将多个路由中间件分组到一个方便的键下,从而允许您一次将多个中间件分配给一个路由。例如,这在同一应用程序中构建 Web UI 和 API 时非常有用。您可以将会话和 CSRF 路由分组到 web 组中,可能将速率限制器分组到 api 组中。

事实上,默认的 Laravel 5.2 应用程序结构正是采用这种方法。例如,在默认的 App\Http\Kernel.php 文件中,您会发现以下内容:

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 组分配给路由,如下所示:

php
Route::group(['middleware' => ['web']], function () {
    //
});

然而,请记住,web 中间件组已经默认应用于您的路由,因为 RouteServiceProvider 在默认中间件组中包含了它。

速率限制

框架现在包含一个新的速率限制器中间件,允许您轻松限制给定 IP 地址在指定分钟数内对路由的请求次数。例如,要限制单个 IP 地址每分钟 60 次请求,您可以执行以下操作:

php
Route::get('/api/users', ['middleware' => 'throttle:60,1', function () {
    //
}]);

数组验证

在 Laravel 5.2 中,验证数组表单输入字段变得更加容易。例如,要验证给定数组输入字段中的每个电子邮件是否唯一,您可以执行以下操作:

php
$validator = Validator::make($request->all(), [
    'person.*.email' => 'email|unique:users'
]);

同样,您可以在语言文件中指定验证消息时使用 * 字符,使得为基于数组的字段使用单个验证消息变得轻而易举:

php
'custom' => [
    'person.*.email' => [
        'unique' => '每个人必须有一个唯一的电子邮件地址',
    ]
],

Bail 验证规则

添加了一个新的 bail 验证规则,该规则指示验证器在给定规则的第一个验证失败后停止验证。例如,您现在可以防止验证器在属性未通过 integer 检查时运行 unique 检查:

php
$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 通过采用 PSR-2 并添加事件广播、中间件参数、Artisan 改进等,继续改进 Laravel 5.0。

PHP 5.5.9+

由于 PHP 5.4 将在 9 月进入“生命周期结束”并且不再从 PHP 开发团队接收安全更新,Laravel 5.1 需要 PHP 5.5.9 或更高版本。PHP 5.5.9 允许与流行的 PHP 库(如 Guzzle 和 AWS SDK)的最新版本兼容。

LTS

Laravel 5.1 是第一个获得长期支持的 Laravel 版本。Laravel 5.1 将获得 2 年的错误修复和 3 年的安全修复。此支持窗口是 Laravel 提供的最长支持窗口,为更大规模的企业客户和客户提供稳定性和安心。

PSR-2

PSR-2 编码风格指南 已被采用为 Laravel 框架的默认风格指南。此外,所有生成器都已更新以生成符合 PSR-2 的语法。

文档

Laravel 文档的每一页都经过了仔细审查并进行了显著改进。所有代码示例也经过审查和扩展,以提供更多的相关性和上下文。

事件广播

在许多现代 Web 应用程序中,Web 套接字用于实现实时、实时更新的用户界面。当服务器上的某些数据更新时,通常会通过 Web 套接字连接发送消息以由客户端处理。

为了帮助您构建这些类型的应用程序,Laravel 使“广播”事件通过 Web 套接字连接变得轻而易举。广播 Laravel 事件允许您在服务器端代码和客户端 JavaScript 框架之间共享相同的事件名称。

要了解有关事件广播的更多信息,请查看事件文档

中间件参数

中间件现在可以接收额外的自定义参数。例如,如果您的应用程序需要在执行给定操作之前验证经过身份验证的用户是否具有给定“角色”,您可以创建一个 RoleMiddleware,该中间件接收角色名称作为额外参数:

php
<?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);
    }

}

定义路由时可以通过用 : 分隔中间件名称和参数来指定中间件参数。多个参数应以逗号分隔:

php
Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) {
    //
}]);

有关中间件的更多信息,请查阅中间件文档

测试大修

Laravel 的内置测试功能得到了显著改进。各种新方法提供了一种流畅、表达式丰富的界面,用于与应用程序交互并检查其响应。例如,请查看以下测试:

php
public function testNewUserRegistration()
{
    $this->visit('/register')
         ->type('Taylor', 'name')
         ->check('terms')
         ->press('Register')
         ->seePageIs('/dashboard');
}

有关测试的更多信息,请查阅测试文档

模型工厂

Laravel 现在附带了一种简单的方法来使用模型工厂创建存根 Eloquent 模型。模型工厂允许您轻松定义 Eloquent 模型的“默认”属性集,然后为测试或数据库种子生成测试模型实例。模型工厂还利用强大的 Faker PHP 库来生成随机属性数据:

php
$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 命令现在可以使用简单的、类似路由的“签名”定义,这为定义命令行参数和选项提供了一个极其简单的界面。例如,您可以像这样定义一个简单的命令及其选项:

php
/**
 * 控制台命令的名称和签名。
 *
 * @var string
 */
protected $signature = 'email:send {user} {--force}';

有关定义 Artisan 命令的更多信息,请查阅Artisan 文档

文件夹结构

为了更好地表达意图,app/Commands 目录已重命名为 app/Jobs。此外,app/Handlers 目录已合并为一个简单的 app/Listeners 目录,其中仅包含事件监听器。然而,这不是一个破坏性更改,您不需要更新到新的文件夹结构即可使用 Laravel 5.1。

加密

在 Laravel 的早期版本中,加密由 mcrypt PHP 扩展处理。然而,从 Laravel 5.1 开始,加密由 openssl 扩展处理,该扩展维护得更为积极。

Laravel 5.0

Laravel 5.0 为默认的 Laravel 项目引入了一个全新的应用程序结构。这个新结构为在 Laravel 中构建一个强大的应用程序提供了更好的基础,并在整个应用程序中采用了新的自动加载标准(PSR-4)。首先,让我们看看一些主要变化:

新的文件夹结构

旧的 app/models 目录已被完全删除。相反,您的所有代码都直接位于 app 文件夹中,并且默认情况下组织到 App 命名空间中。可以使用新的 app:name Artisan 命令快速更改此默认命名空间。

控制器、中间件和请求(Laravel 5.0 中的新类类型)现在分组在 app/Http 目录下,因为它们都是与应用程序的 HTTP 传输层相关的类。所有中间件现在都分为各自的类文件,而不是单个、扁平的路由过滤器文件。

新的 app/Providers 目录取代了以前版本的 Laravel 4.x 中的 app/start 文件。这些服务提供者为应用程序提供各种引导功能,例如错误处理、日志记录、路由加载等。当然,您可以为应用程序创建其他服务提供者。

应用程序语言文件和视图已移至 resources 目录。

合同

所有主要的 Laravel 组件都实现了位于 illuminate/contracts 仓库中的接口。此仓库没有外部依赖项。拥有一个方便的、集中定位的接口集,您可以用于解耦和依赖注入,将作为 Laravel 外观的简单替代选项。

有关合同的更多信息,请查阅完整文档

路由缓存

如果您的应用程序完全由控制器路由组成,您可以利用新的 route:cache Artisan 命令来大幅加快路由的注册速度。这在具有 100 多个路由的应用程序中尤其有用,并将大幅加快应用程序的这一部分。

路由中间件

除了 Laravel 4 风格的路由“过滤器”之外,Laravel 5 现在支持 HTTP 中间件,并且包含的身份验证和 CSRF“过滤器”已转换为中间件。中间件提供了一种单一、一致的接口来替换所有类型的过滤器,允许您在请求进入应用程序之前轻松检查甚至拒绝请求。

有关中间件的更多信息,请查阅文档

控制器方法注入

除了现有的构造函数注入之外,您现在可以在控制器方法上进行依赖注入。服务容器将自动注入依赖项,即使路由包含其他参数:

php
public function createPost(Request $request, PostRepository $posts)
{
    //
}

身份验证脚手架

用户注册、身份验证和密码重置控制器现在开箱即用,并附带简单的相应视图,这些视图位于 resources/views/auth。此外,框架中包含了一个“用户”表迁移。包括这些简单的资源可以快速开发应用程序想法,而不会因身份验证样板代码而拖慢速度。身份验证视图可以在 auth/loginauth/register 路由上访问。App\Services\Auth\Registrar 服务负责用户验证和创建。

事件对象

您现在可以将事件定义为对象,而不仅仅是使用字符串。例如,请查看以下事件:

php
<?php

class PodcastWasPurchased
{
    public $podcast;

    public function __construct(Podcast $podcast)
    {
        $this->podcast = $podcast;
    }
}

事件可以像往常一样触发:

php
Event::fire(new PodcastWasPurchased($podcast));

当然,您的事件处理程序将接收事件对象而不是数据列表:

php
<?php

class ReportPodcastPurchase
{
    public function handle(PodcastWasPurchased $event)
    {
        //
    }
}

有关使用事件的更多信息,请查阅完整文档

命令 / 队列

除了 Laravel 4 支持的队列作业格式之外,Laravel 5 允许您将队列作业表示为简单的命令对象。这些命令位于 app/Commands 目录中。以下是一个示例命令:

php
<?php

class PurchasePodcast extends Command implements SelfHandling, ShouldBeQueued
{
    use SerializesModels;

    protected $user, $podcast;

    /**
     * 创建一个新的命令实例。
     *
     * @return void
     */
    public function __construct(User $user, Podcast $podcast)
    {
        $this->user = $user;
        $this->podcast = $podcast;
    }

    /**
     * 执行命令。
     *
     * @return void
     */
    public function handle()
    {
        // 处理购买播客的逻辑...

        event(new PodcastWasPurchased($this->user, $this->podcast));
    }
}

基本 Laravel 控制器利用新的 DispatchesCommands trait,允许您轻松调度命令以执行:

php
$this->dispatch(new PurchasePodcastCommand($user, $podcast));

当然,您也可以将命令用于同步执行的任务(不排队)。事实上,使用命令是封装应用程序需要执行的复杂任务的好方法。有关更多信息,请查阅命令总线文档。

数据库队列

Laravel 现在包含一个 database 队列驱动程序,提供一个简单的、本地队列驱动程序,只需安装数据库软件即可。

Laravel 调度器

过去,开发人员为他们希望调度的每个控制台命令生成一个 Cron 条目。然而,这是一种麻烦。您的控制台计划不再在源代码管理中,您必须 SSH 到服务器以添加 Cron 条目。让我们的生活更轻松。Laravel 命令调度器允许您在 Laravel 本身中流畅地、表达性地定义命令计划,并且只需要在服务器上添加一个 Cron 条目。

它看起来像这样:

php
$schedule->command('artisan:command')->dailyAt('15:00');

当然,请查阅完整文档以了解有关调度器的所有信息!

Tinker / Psysh

php artisan tinker 命令现在使用 Psysh 由 Justin Hileman 开发的更强大的 PHP REPL。如果您喜欢 Laravel 4 中的 Boris,那么您会喜欢 Psysh。更好的是,它在 Windows 上也能工作!要开始,请尝试:

php
php artisan tinker

DotEnv

Laravel 5 现在使用 Vance Lucas 的 DotEnv 代替各种混乱的、嵌套的环境配置目录。此库提供了一种超级简单的方式来管理环境配置,并使 Laravel 5 中的环境检测变得轻而易举。有关更多详细信息,请查阅完整的配置文档

Laravel Elixir

Laravel Elixir 由 Jeffrey Way 开发,提供了一种流畅、表达性强的界面,用于编译和连接资产。如果您曾经对学习 Grunt 或 Gulp 感到恐惧,现在不必担心了。Elixir 使使用 Gulp 编译 Less、Sass 和 CoffeeScript 变得轻而易举。它甚至可以为您运行测试!

有关 Elixir 的更多信息,请查阅完整文档

Laravel Socialite

Laravel Socialite 是一个可选的、与 Laravel 5.0+ 兼容的包,提供完全无痛的 OAuth 提供者身份验证。目前,Socialite 支持 Facebook、Twitter、Google 和 GitHub。它看起来像这样:

php
public function redirectForAuth()
{
    return Socialize::with('twitter')->redirect();
}

public function getUserFromProvider()
{
    $user = Socialize::with('twitter')->user();
}

不再需要花费数小时编写 OAuth 身份验证流程。几分钟内即可开始!完整文档包含所有详细信息。

Flysystem 集成

Laravel 现在包含强大的 Flysystem 文件系统抽象库,提供与本地、Amazon S3 和 Rackspace 云存储的无痛集成 - 所有这些都通过一个统一而优雅的 API!在 Amazon S3 中存储文件现在就像这样简单:

php
Storage::put('file.txt', 'contents');

有关 Laravel Flysystem 集成的更多信息,请查阅完整文档

表单请求

Laravel 5.0 引入了表单请求,它们扩展了 Illuminate\Foundation\Http\FormRequest 类。这些请求对象可以与控制器方法注入结合使用,以提供一种无样板的方法来验证用户输入。让我们深入了解并查看一个示例 FormRequest

php
<?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;
    }
}

一旦定义了类,我们可以在控制器操作上进行类型提示:

php
public function register(RegisterRequest $request)
{
    var_dump($request->input());
}

当 Laravel 服务容器识别出它正在注入的类是 FormRequest 实例时,请求将自动验证。这意味着如果调用了控制器操作,您可以安全地假设 HTTP 请求输入已根据您在表单请求类中指定的规则进行了验证。更重要的是,如果请求无效,将自动发出 HTTP 重定向,您可以自定义,并且错误消息将被闪存到会话中或转换为 JSON。**表单验证从未如此简单。**有关 FormRequest 验证的更多信息,请查阅文档

简单的控制器请求验证

Laravel 5 基础控制器现在包括一个 ValidatesRequests trait。此 trait 提供了一个简单的 validate 方法来验证传入请求。如果 FormRequests 对您的应用程序来说有点过多,请查看以下内容:

php
public function createPost(Request $request)
{
    $this->validate($request, [
        'title' => 'required|max:255',
        'body' => 'required',
    ]);
}

如果验证失败,将抛出异常,并自动将适当的 HTTP 响应发送回浏览器。验证错误甚至会被闪存到会话中!如果请求是 AJAX 请求,Laravel 甚至会负责将验证错误的 JSON 表示发送回您。

有关此新方法的更多信息,请查阅文档

新生成器

为了补充新的默认应用程序结构,框架中添加了新的 Artisan 生成器命令。有关更多详细信息,请参阅 php artisan list

配置缓存

您现在可以使用 config:cache 命令将所有配置缓存到一个文件中。

Symfony VarDumper

流行的 dd 辅助函数已升级为使用惊人的 Symfony VarDumper。这提供了彩色编码的输出,甚至可以折叠数组。只需在项目中尝试以下内容:

php
dd([1, 2, 3]);

Laravel 4.2

通过从 4.2 安装中运行 php artisan changes 命令或在 GitHub 上查看更改文件来查看此版本的完整更改列表。这些说明仅涵盖发布的主要增强和更改。

exclamation

在 4.2 发布周期中,许多小错误修复和增强已被合并到各种 Laravel 4.1 点发布中。因此,请务必查看 Laravel 4.1 的更改列表!

PHP 5.4 要求

Laravel 4.2 需要 PHP 5.4 或更高版本。此升级的 PHP 要求允许我们使用新的 PHP 功能,例如 traits,以提供更具表现力的接口,例如 Laravel Cashier。PHP 5.4 还带来了显著的速度和性能改进。

Laravel Forge

Laravel Forge 是一个新的基于 Web 的应用程序,提供了一种简单的方法来在您选择的云上创建和管理 PHP 服务器,包括 Linode、DigitalOcean、Rackspace 和 Amazon EC2。支持自动化 Nginx 配置、SSH 密钥访问、Cron 作业自动化、通过 NewRelic 和 Papertrail 进行服务器监控、“推送部署”、Laravel 队列工作者配置等,Forge 提供了启动所有 Laravel 应用程序的最简单和最实惠的方法。

默认的 Laravel 4.2 安装的 app/config/database.php 配置文件现在默认配置为 Forge 使用,允许更方便地将新应用程序部署到平台上。

有关 Laravel Forge 的更多信息,请访问官方 Forge 网站

Laravel Homestead

Laravel Homestead 是一个官方的 Vagrant 环境,用于开发强大的 Laravel 和 PHP 应用程序。大多数盒子的配置需求在盒子打包分发之前就已处理完毕,使盒子启动速度极快。Homestead 包括 Nginx 1.6、PHP 5.6、MySQL、Postgres、Redis、Memcached、Beanstalk、Node、Gulp、Grunt 和 Bower。Homestead 包括一个简单的 Homestead.yaml 配置文件,用于在单个盒子上管理多个 Laravel 应用程序。

默认的 Laravel 4.2 安装现在包括一个 app/config/local/database.php 配置文件,默认配置为使用 Homestead 数据库,使 Laravel 的初始安装和配置更加方便。

官方文档也已更新,包括 Homestead 文档

Laravel Cashier

Laravel Cashier 是一个简单、表达性强的库,用于管理 Stripe 的订阅计费。随着 Laravel 4.2 的引入,我们将 Cashier 文档与主要的 Laravel 文档一起包含,尽管组件本身的安装仍然是可选的。此版本的 Cashier 带来了众多错误修复、多货币支持以及与最新 Stripe API 的兼容性。

守护进程队列工作者

Artisan queue:work 命令现在支持 --daemon 选项,以“守护进程模式”启动工作者,这意味着工作者将继续处理作业,而不会重新启动框架。这大大减少了 CPU 使用率,但代价是稍微复杂的应用程序部署过程。

有关守护进程队列工作者的更多信息,请查阅队列文档

邮件 API 驱动程序

Laravel 4.2 引入了新的 Mailgun 和 Mandrill API 驱动程序,用于 Mail 功能。对于许多应用程序,这提供了一种比 SMTP 选项更快、更可靠的发送电子邮件的方法。新驱动程序利用 Guzzle 4 HTTP 库。

软删除 Traits

通过 PHP 5.4 traits 引入了一种更清晰的“软删除”和其他“全局作用域”的架构。这种新架构允许更轻松地构建类似的全局 traits,并在框架本身中实现更清晰的关注点分离。

有关新 SoftDeletingTrait 的更多信息,请查阅 Eloquent 文档

方便的 Auth 和 Remindable Traits

默认的 Laravel 4.2 安装现在使用简单的 traits 来包含身份验证和密码提醒用户界面所需的属性。这为开箱即用的默认 User 模型文件提供了更清晰的结构。

“简单分页”

在查询和 Eloquent 构建器中添加了一个新的 simplePaginate 方法,允许在分页视图中使用简单的“下一页”和“上一页”链接时进行更高效的查询。

迁移确认

在生产环境中,破坏性迁移操作现在将要求确认。可以使用 --force 命令强制运行命令而无需任何提示。

Laravel 4.1

完整更改列表

通过从 4.1 安装中运行 php artisan changes 命令或在 GitHub 上查看更改文件来查看此版本的完整更改列表。这些说明仅涵盖发布的主要增强和更改。

新的 SSH 组件

此版本引入了一个全新的 SSH 组件。此功能允许您轻松 SSH 到远程服务器并运行命令。要了解更多信息,请查阅 SSH 组件文档

新的 php artisan tail 命令利用了新的 SSH 组件。有关更多信息,请查阅 tail 命令文档

Boris 在 Tinker 中

如果您的系统支持,php artisan tinker 命令现在使用 Boris REPL。要使用此功能,必须安装 readlinepcntl PHP 扩展。如果您没有这些扩展,将使用 4.0 中的 shell。

Eloquent 改进

Eloquent 中添加了一个新的 hasManyThrough 关系。要了解如何使用它,请查阅 Eloquent 文档

还引入了一个新的 whereHas 方法,允许基于关系约束检索模型

数据库读/写连接

现在可以在整个数据库层,包括查询构建器和 Eloquent 中自动处理单独的读/写连接。有关更多信息,请查阅文档

队列优先级

通过将逗号分隔的列表传递给 queue:listen 命令,现在支持队列优先级。

失败的队列作业处理

队列功能现在包括在使用 queue:listen 上的新 --tries 开关时自动处理失败的作业。有关处理失败作业的更多信息,请查阅队列文档

缓存标签

缓存“部分”已被“标签”取代。缓存标签允许您为缓存项分配多个“标签”,并刷新分配给单个标签的所有项。有关使用缓存标签的更多信息,请查阅缓存文档

灵活的密码提醒

密码提醒引擎已更改,以提供更大的开发者灵活性,例如验证密码、将状态消息闪存到会话等。有关使用增强的密码提醒引擎的更多信息,请查阅文档

改进的路由引擎

Laravel 4.1 具有完全重写的路由层。API 是相同的;然而,与 4.0 相比,注册路由的速度提高了 100%。整个引擎已大大简化,并且对 Symfony 路由的依赖已最小化到路由表达式的编译。

改进的会话引擎

随着此版本的发布,我们还引入了一个全新的会话引擎。与路由改进类似,新的会话层更精简、更快。我们不再使用 Symfony(因此也不使用 PHP)的会话处理功能,而是使用一个更简单、更易于维护的自定义解决方案。

Doctrine DBAL

如果您在迁移中使用 renameColumn 函数,您需要将 doctrine/dbal 依赖项添加到 composer.json 文件中。此包不再默认包含在 Laravel 中。