# 发行说明

# 版本计划

Laravel及其其他第一方软件包遵循语义版本控制。主要框架版本每六个月(〜2月和〜8月)发布,次要版本和补丁版本可能每周发布一次。次要和修补程序版本应该永远包含重大更改。

从应用程序或软件包中引用Laravel框架或其组件时,应始终使用诸如的版本约束,因为Laravel的主要发行版确实包含重大更改。但是,我们努力确保您可以在一天或更短的时间内更新到新的主要版本。^7.0

# 支援政策

对于LTS版本,例如Laravel 6,提供了2年的错误修复,提供了3年的安全修复。这些版本提供了最长的支持和维护窗口。对于一般发行版,错误修复提供了6个月,安全修复提供了1年。对于包括Lumen在内的所有其他库,只有最新版本才能修复错误。另外,请查看Laravel支持的数据库版本。

释放 错误修复,直到 安全修复,直到
5.5(LTS) 2017年8月30日 2019年8月30日 2020年8月30日
5.6 2018年2月7日 2018年8月7日 2019年2月7日
5.7 2018年9月4日 2019年3月4日 2019年9月4日
5.8 2019年2月26日 2019年8月26日 2020年2月26日
6(LTS) 2019年9月3日 2021年9月3日 2022年9月3日
7 2020年3月3日 2020年9月3日 2021年3月3日

# Laravel 7

Laravel 7通过引入Laravel Sanctum,路由速度改进,自定义Eloquent强制转换,Blade组件标签,流利的字符串操作,开发人员专用的HTTP客户端,第一方CORS支持,改进的路由模型绑定作用域,继续在Laravel 6.x中进行了改进。 ,存根定制,数据库队列改进,多个邮件驱动程序,查询时间强制转换,新artisan test命令以及各种其他错误修复和可用性改进。

# Laravel Sanctum

Laravel Sanctum由泰勒·奥特威尔Taylor Otwell**)建造

Laravel Sanctum为SPA(单页应用程序),移动应用程序和基于令牌的简单API提供了轻巧的身份验证系统。Sanctum允许您的应用程序的每个用户为其帐户生成多个API令牌。这些令牌可以被授予能力/范围,其指定允许令牌执行哪些动作。

有关Laravel Sanctum的更多信息,请参阅Sanctum文档。

# 自定义 Eloquent 类型转换

泰勒·奥特威尔Taylor Otwell)制作了《风俗口才》演员

Laravel有多种内置的,有用的强制类型。但是,您有时可能需要定义自己的强制类型。您现在可以通过定义实现该CastsAttributes接口的类来完成此操作。

实现此接口的类必须定义getset方法。该get方法负责将数据库中的原始值转换为转换值,而该set方法应将转换值转换为可以存储在数据库中的原始值。例如,我们将重新实现内置的json强制类型作为自定义强制类型:

<?php

namespace App\Casts;

use Illuminate\Contracts\Database\Eloquent\CastsAttributes;

class Json implements CastsAttributes
{
    /**
     * Cast the given value.
     *
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @param  string  $key
     * @param  mixed  $value
     * @param  array  $attributes
     * @return array
     */
    public function get($model, $key, $value, $attributes)
    {
        return json_decode($value, true);
    }

    /**
     * Prepare the given value for storage.
     *
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @param  string  $key
     * @param  array  $value
     * @param  array  $attributes
     * @return string
     */
    public function set($model, $key, $value, $attributes)
    {
        return json_encode($value);
    }
}

定义自定义转换类型后,可以使用其类名将其附加到模型属性:

<?php

namespace App;

use App\Casts\Json;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'options' => Json::class,
    ];
}

要了解如何编写自定义Eloquent强制转换,包括将自变量强制转换为值对象,请查阅Eloquent文档。

# Blade组件和改进

刀片组件标签由SpatieMarcel PociotCaleb PorzioDries VintsTaylor Otwell贡献

img

刀片组件已进行了大修,以允许基于标签的渲染,属性管理,组件类,嵌入式视图组件等。由于Blade组件的检修非常广泛,因此请查阅完整的Blade组件文档以了解此功能。

总之,一个组件现在可以具有一个关联的类,该类指定了它接受的数据。组件类上定义的所有公共属性和方法将自动提供给组件视图。可以使用自动包含的$attributes变量(属性包实例)来管理在组件上指定的任何其他HTML属性。

在此示例中,我们将假定已定义组件,如下所示:App\View\Components\Alert

<?php

namespace App\View\Components;

use Illuminate\View\Component;

class Alert extends Component
{
    /**
     * The alert type.
     *
     * @var string
     */
    public $type;

    /**
     * Create the component instance.
     *
     * @param  string  $type
     * @return void
     */
    public function __construct($type)
    {
        $this->type = $type;
    }

    /**
     * Get the class for the given alert type.
     *
     * @return string
     */
    public function classForType()
    {
        return $this->type == 'danger' ? 'alert-danger' : 'alert-warning';
    }

    /**
     * Get the view / contents that represent the component.
     *
     * @return \Illuminate\View\View|string
     */
    public function render()
    {
        return view('components.alert');
    }
}

并且,假设组件的Blade模板已定义如下:

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

<div class="alert {{ $classForType }}" {{ $attributes }}>
    {{ $heading }}

    {{ $slot }}
</div>

可以使用组件的标签在另一个Blade视图中呈现该组件:

<x-alert type="error" class="mb-4">
    <x-slot name="heading">
        Alert content...
    </x-slot>

    Default slot content...
</x-alert>

如前所述,这只是Laravel 7中Blade组件大修功能的很小一部分,并且没有演示匿名组件,内联视图组件以及各种其他功能。请查阅完整的Blade组件文档以了解此功能。

@componentBlade组件的先前语法尚未并且不会被删除。

# HTTP客户端

HTTP客户端是Guzzle的包装,由Adam WathanJason McCrearyTaylor Otwell贡献

现在,LaravelGuzzle HTTP客户端周围提供了一种表达性极强的 API ,使您可以快速发出传出的HTTP请求以与其他Web应用程序进行通信。Laravel围绕Guzzle的包装专注于其最常见的用例和出色的开发人员体验。例如,客户端可以轻松实现POSTJSON数据并与之交互:

use Illuminate\Support\Facades\Http;

$response = Http::withHeaders([
    'X-First' => 'foo',
    'X-Second' => 'bar'
])->post('http://test.com/users', [
    'name' => 'Taylor',
]);

return $response['id'];

此外,HTTP客户端提供了出色的,符合人体工程学的测试功能:

Http::fake([
    // Stub a JSON response for GitHub endpoints...
    'github.com/*' => Http::response(['foo' => 'bar'], 200, ['Headers']),

    // Stub a string response for Google endpoints...
    'google.com/*' => Http::response('Hello World', 200, ['Headers']),

    // Stub a series of responses for Facebook endpoints...
    'facebook.com/*' => Http::sequence()
                            ->push('Hello World', 200)
                            ->push(['foo' => 'bar'], 200)
                            ->pushStatus(404),
]);

要了解有关HTTP客户端的所有功能的更多信息,请查阅HTTP客户端文档。

# 流畅的字符串操作

流畅的字符串操作由Taylor Otwell 贡献。

您可能熟悉Laravel的现有Illuminate\Support\Str类,该类提供了许多有用的字符串操作功能。Laravel 7现在提供了一个基于这些功能之上的更加面向对象的流利字符串操作库。您可以使用Str::of方法创建流利的Illuminate\Support\Stringable对象。然后可以将各种方法链接到对象上以操作字符串:

return (string) Str::of('  Laravel Framework 6.x ')
                    ->trim()
                    ->replace('6.x', '7.x')
                    ->slug();

有关通过流畅的字符串操作可用的方法的更多信息,请查阅其完整文档。

# 路由模型绑定改进

*路线模型绑定改进由Taylor Otwell*贡献

# 自定义键名

有时,您可能希望使用以外的列来解析Eloquent模型id。为此,Laravel 7允许您在route参数定义中指定列:

Route::get('api/posts/{post:slug}', function (App\Post $post) {
    return $post;
});

# 自动绑定

有时,当在单个路由定义中隐式绑定多个Eloquent模型时,您可能希望对第二个Eloquent模型进行范围划分,使其必须是第一个Eloquent模型的子代。例如,考虑这种情况,该情况是通过Slug为特定用户检索博客文章的:

use App\Post;
use App\User;

Route::get('api/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
    return $post;
});

当使用自定义键隐式绑定作为嵌套路由参数时,Laravel 7将自动确定查询范围,以使用约定猜测其父级上的关系名称,以其父级检索嵌套模型。在这种情况下,将假设User模型具有posts可用于检索Post模型的命名关系(路径参数名的复数)。

有关路由模型绑定的更多信息,请查阅路由文档。

# 多个邮件驱动程序

*多个邮件驱动程序支持由Taylor Otwell*贡献

Laravel 7允许为单个应用程序配置多个“邮件程序”。在mail配置文件中配置的每个邮件程序可能都有其自己的选项,甚至具有自己唯一的“传输”,从而允许您的应用程序使用不同的电子邮件服务来发送某些电子邮件。例如,您的应用程序可能使用Postmark发送事务邮件,而使用Amazon SES发送批量邮件。

默认情况下,Laravel将使用配置文件中配置为default邮件程序的邮件程序mail。但是,您可以使用该mailer方法通过特定的邮件程序配置发送消息:

Mail::mailer('postmark')
        ->to($request->user())
        ->send(new OrderShipped($order));

# 路由缓存速度改进

*路由缓存速度的提高是由上游Symfony贡献者和Dries Vints*贡献的

Laravel 7包括一种新方法,用于匹配已使用Artisan命令缓存的已编译缓存路由。在大型应用程序(例如,具有800条或更多路由的应用程序)上,这些改进可以使简单的“ Hello World”基准每秒请求的速度提高2倍。无需更改您的应用程序。route:cache

# CORS支持

CORS支持由Barry vd提供。赫维尔

Laravel 7 OPTIONS通过集成由Barry vd编写的流行的Laravel CORS软件包,提供了对配置跨域资源共享(CORS)请求响应的第一方支持。快点 新的cors配置包含在默认的Laravel应用程序框架中

有关Laravel 7.x中对CORS支持的更多信息,请查阅CORS文档

# 查询时转换

*查询时间转换由Matt Barlow*贡献

有时,您可能需要在执行查询时应用强制转换,例如从表中选择原始值时。例如,考虑以下查询:

use App\Post;
use App\User;

$users = User::select([
    'users.*',
    'last_posted_at' => Post::selectRaw('MAX(created_at)')
            ->whereColumn('user_id', 'users.id')
])->get();

last_posted_at查询结果的属性将是原始字符串。如果date在执行查询时可以将强制类型转换应用于此属性,将很方便。为此,我们可以使用withCastsLaravel 7提供的方法:

$users = User::select([
    'users.*',
    'last_posted_at' => Post::selectRaw('MAX(created_at)')
            ->whereColumn('user_id', 'users.id')
])->withCasts([
    'last_posted_at' => 'date'
])->get();

# MySQL 8+数据库队列改进

*MySQL数据库队列的改进由Mohamed Said*贡献

在以前的Laravel版本中database,由于死锁,队列被认为不足以用于生产。但是,Laravel 7对使用MySQL 8+作为数据库支持队列的应用程序进行了改进。通过使用子句和其他SQL增强功能,现在可以安全地将驱动程序用于批量生产的应用程序中。FOR UPDATE SKIP LOCKED``database

# Article test 命令

test命令由努诺·马杜罗Nuno Maduro**)贡献

除了phpunit命令之外,您现在还可以使用testArtisan命令来运行测试。Artisan测试运行器提供了漂亮的控制台UX,以及有关当前正在运行的测试的更多信息。此外,跑步者将在第一次测试失败时自动停止:

php artisan test

img

可以传递给phpunit命令的任何参数也可以传递给Artisan test命令:

php artisan test --group=feature

# Markdown邮件模板改进

*Markdown邮件模板的改进由Taylor Otwell*贡献

默认的Markdown邮件模板已收到基于Tailwind CSS调色板的全新,更现代的设计。当然,可以根据您的应用程序的需要来发布和定制此模板:

img

有关Markdown邮件的更多信息,请查阅邮件文档

# stub定制

*存根定制由Taylor Otwell*贡献

Artisan控制台的make命令用于创建各种类,例如控制器,作业,迁移和测试。这些类是使用“存根”文件生成的,这些文件中会根据您的输入填充值。但是,有时您可能希望对Artisan生成的文件进行小的更改。为此,Laravel 7提供了发布最常见的存根进行自定义的命令:stub:publish

php artisan stub:publish

已发布的存根将位于stubs应用程序根目录中的目录中。使用Artisan make命令生成它们的相应类时,将反映您对这些存根所做的任何更改。

# 队列maxExceptions配置

*该maxExceptions财产由Mohamed Said*贡献

有时您可能希望指定可以尝试多次的作业,但是如果重试是由给定数量的异常触发的,则该作业会失败。在Laravel 7中,您可以maxExceptions在作业类上定义一个属性:

<?php

namespace App\Jobs;

class ProcessPodcast implements ShouldQueue
{
    /**
     * The number of times the job may be attempted.
     *
     * @var int
     */
    public $tries = 25;

    /**
     * The maximum number of exceptions to allow before failing.
     *
     * @var int
     */
    public $maxExceptions = 3;

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        Redis::throttle('key')->allow(10)->every(60)->then(function () {
            // Lock obtained, process the podcast...
        }, function () {
            // Unable to obtain lock...
            return $this->release(10);
        });
    }
}

在此示例中,如果应用程序无法获得Redis锁,则该作业将被释放十秒钟,并将继续重试25次。但是,如果作业抛出三个未处理的异常,则该作业将失败。