版本化方案
Laravel及官方发布的包皆遵循 语义版本化。主要框架版本每六个月发布一次 (~2月和~8月),而次要和补丁版本可能每周发布一次。次要版本和补丁 决不 包含非兼容性更改。
引入 Laravel 框架或其组件时,应始终使用版本约束,如 ^7.0,因为 Laravel 的主要版本确实包含非兼容性更改。我们会努力确保您可以在一天或更短的时间内更新到最新版本。
支持政策
对于 LTS 版本,例如 Laravel 6,提供了 2 年的错误修复和3年的安全修复。这些版本提供了最长的支持和维护窗口。对于一般的发行版本,只提供了 6 个月的错误修复和 1 年的安全修复。对于包括 Lumen 在内的所有其他版本,只有最新版本才会修复错误。此外,请查阅 Laravel 支持的 数据库版本。
Laravel 7
Laravel 7 通过引入 Laravel Sanctum,路由速度改进,自定义 Eloquent 强制转换(casts), Blade 组件标签,流畅的字符串操作,开发人员专用的 HTTP 客户端, 第一方 CORS 支持, 路由模型绑定作用域改进, 存根自定义, 数据库队列改进, 多邮箱驱动, 查询时间强制转换(casts),新的 artisan test 命令,以及各种其他错误修复和可用性改进,对 Laravel 6.x 继续进行了改善。
Laravel Sanctum
Laravel Sanctum 由 Taylor Otwell建造。
Laravel Sanctum 为 SPA (单页应用程序),移动应用程序和基于令牌的简单 API 提供了轻巧的身份验证系统。 Sanctum 允许应用程序的每个用户生成多个 API 令牌。 这些令牌可以被授予能力/作用域,用于指定允许令牌执行哪些动作。
有关 Laravel Sanctum 的更多信息, 请查看 Sanctum 文档。
自定义 Eloquent 类型转换
自定义 Eloquent 类型转换由 Taylor Otwell 开发贡献.
Laravel 内置了多种常用的类型转换。但是,用户偶尔会需要将数据转换成自定义类型。现在,该需求可以通过定义一个实现 CastsAttributes 接口的类来完成
实现了该接口的类必须事先定义一个 get 和 set 方法。 get 方法负责将从数据库中获取的原始数据转换成对应的类型,而 set 方法则是将数据转换成对应的数据库类型以便存入数据库中。举个例子,下面我们将内置的 json 类型转换以自定义类型转换的形式重新实现一遍:
<?php namespace App\Casts; use Illuminate\Contracts\Database\Eloquent\CastsAttributes; class Json implements CastsAttributes { /** * 将取出的数据进行转换 * * @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); } /** * 转换成将要进行存储的值 * * @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 { /** * 这个属性应该被转化为原生类型 * * @var array */ protected $casts = [ 'options' => Json::class, ]; }
要学习如何实现自定义 Eloquent 类型转换,包括转换成特定值对象的类型转换,请参照 Eloquent documentation。
Blade 组件标签和变化
Blade 组件标签贡献人员有 Spatie, Marcel Pociot, Caleb Porzio, Dries Vints, 和 Taylor Otwell.
{小提示} Blade 组件已经大刀阔斧修改,其中变化有允许基于标签的渲染,参数管理,组件类,内联视图组件众多变化。经过修改的 Blade 组件如此之多,请从这里 Blade文档来学习这些新特性。
总结为一句,现在的一个组件能从指定的类获取数据。所有的公开属性和方法都清晰地定义在组件类里,会自动组装成组件视图。任何附加的 HTML 属性都指定于一个可以被管理的自动包含$attribute 变量的组件,它是一个属性包的实例。
下面有个例子,我们会假设一个 App\View\Components\Alert 组件定义是这样的:
<?php namespace App\View\Components; use Illuminate\View\Component; class Alert extends Component { /** * 提醒类型 * * @var string */ public $type; /** * 创建组件实例. * * @param string $type * @return void */ public function __construct($type) { $this->type = $type; } /** *获取给提醒类型的类 * * @return string */ public function classForType() { return $this->type == 'danger' ? 'alert-danger' : 'alert-warning'; } /** * 获取渲染组件的视图/内容 * * @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>
如前所述,在大改之后的 Laravel7 当中这是一个非常小又普通的一个功能,而且还没有演示匿名组件,内联视图组件和各种各样的其他特性。请从这里Blade文档来学习这些新特性
{注意} 以前的 Blade 组件 @component 语法没有被移除。
HTTP 客户端
HTTP 客户端是 Guzzle 的一个封装,由 Adam Wathan,Jason McCreary,和 Taylor Otwell 提供。
Laravel 现在提供一套围绕 Guzzle HTTP 客户端]
(http://docs.guzzlephp.org/en/stable/) 构建的精简且高效的 API,允许你快速向其它 web 应用发起 HTTP 请求。Laravel 基于 Guzzle 的封装专注于最常见的用例和最棒的开发人员体验。例如,客户端发起带 JSON 数据的 POST 请求变得轻而易举:
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();
有关流畅的字符串操作可用方法的更多信息, 请查阅完整文档。