laravel11发行说明(laravel curd)



大家好呀,我是yangyang.今天带来一起 php laravel11的发行说明介绍

发行说明

更新内容

Laravel 11 延续了 Laravel 10.x 中的改进,要求 PHP 版本最低为 8.2,引入了简化的应用程序结构、每秒速率限制、健康路由、优雅的加密密钥轮换、队列测试改进、重新发送邮件传输、提示验证器集成、新的 Artisan 命令等。此外,还引入了第一方可扩展 WebSocket 、服务器 Laravel Reverb,为您的应用程序提供强大的实时功能。

简化的应用程序结构

Laravel 11 为新的Laravel 应用程序引入了简化的应用程序结构,无需对现有应用程序进行任何更改。新的应用程序结构旨在提供更精简、更现代的体验,同时保留 Laravel 开发人员已经熟悉的许多概念。下面我们将讨论 Laravel 新应用程序结构的亮点。

应用程序引导文件

该bootstrap/app.php文件已重新焕发活力,成为代码优先的应用程序配置文件。现在,您可以从此文件中自定义应用程序的路由、中间件、服务提供程序、异常处理等。该文件统一了以前分散在应用程序文件结构中的各种高级应用程序行为设置:

return Application::configure(basePath: dirname(__DIR__))
->withRouting(

 web: __DIR__.'/../routes/web.php',

 commands: __DIR__.'/../routes/console.php',

 health: '/up',

 )

->withMiddleware(function (Middleware $middleware) {

//

 })

->withExceptions(function (Exceptions $exceptions) {

//

 })->create();


服务供应商(ServiceProvider)

Laravel 11 只包含一个AppServiceProvider.以前的服务提供者的功能已合并到 中bootstrap/app.php,由框架自动处理,或者可能放置在您应用程序的AppServiceProvider.

例如,现在默认启用事件发现,很大程度上消除了手动注册事件及其侦听器的需要。但是,如果您确实需要手动注册事件,则只需在AppServiceProvider.同样,您之前在 中注册的路由模型绑定或授权门AuthServiceProvider也可能在 中注册AppServiceProvider。

选择 使用 API 和 广播路由

api.php默认情况下, 和路由channels.php文件不再存在,因为许多应用程序不需要这些文件。相反,它们可以使用简单的 Artisan 命令创建:

php artisan install:api
php artisan install:broadcasting


中间件(Middleware)

此前,新的 Laravel 应用程序包含九个中间件。这些中间件执行各种任务,例如验证请求、修剪输入字符串和验证 CSRF 令牌。

在 Laravel 11 中,这些中间件已移至框架本身中,因此它们不会增加应用程序结构的体积。用于自定义这些中间件行为的新方法已添加到框架中,并且可以从应用程序的bootstrap/app.php文件中调用:

->withMiddleware(function (Middleware $middleware) {
  $middleware->validateCsrfTokens(

 except: ['stripe/*']

 );

$middleware->web(append: [

EnsureUserIsSubscribed::class,

 ])

})


由于所有中间件都可以通过应用程序轻松定制bootstrap/app.php,因此不再需要单独的 HTTP“内核”类。

调度

使用新的Schedule外观,现在可以直接在应用程序的文件中定义计划任务routes/console.php,从而无需单独的控制台“内核”类:

use Illuminate\Support\Facades\Schedule;
Schedule::command('emails:send')->daily();


异常处理

与路由和中间件一样,现在可以从应用程序的bootstrap/app.php文件而不是单独的异常处理程序类来自定义异常处理,从而减少新 Laravel 应用程序中包含的文件总数:

->withExceptions(function (Exceptions $exceptions) {
  $exceptions->dontReport(MissedFlightException::class);

$exceptions->report(function (InvalidOrderException $e) {

// ...

 });

})


基Controller类

新 Laravel 应用程序中包含的基本控制器已得到简化。它不再扩展 Laravel 的内部Controller类,并且AuthorizesRequests和ValidatesRequests特征已被删除,因为如果需要,它们可以包含在应用程序的单独控制器中:

<?php
namespace App\Http\Controllers;

abstract class Controller

{

//

}


应用程序默认值

默认情况下,新的 Laravel 应用程序使用 SQLite 进行数据库存储,以及databaseLaravel 会话、缓存和队列的驱动程序。这允许您在创建新的 Laravel 应用程序后立即开始构建应用程序,而无需安装额外的软件或创建额外的数据库迁移。

此外,随着时间的推移,database这些 Laravel 服务的驱动程序已经变得足够强大,可以在许多应用程序环境中进行生产使用;因此,它们为本地和生产应用程序提供了明智、统一的选择。

Laravel Reverb

Laravel Reverb直接为您的 Laravel 应用程序带来超快且可扩展的实时 WebSocket 通信,并提供与 Laravel 现有事件广播工具套件(例如 Laravel Echo)的无缝集成。

php artisan reverb:start

此外,Reverb 通过 Redis 的发布/订阅功能支持水平扩展,允许您在多个后端 Reverb 服务器之间分配 WebSocket 流量,所有服务器都支持单个高需求应用程序。

有关 Laravel Reverb 的更多信息,请参阅完整的Reverb 文档。

每秒速率限制

Laravel 现在支持所有速率限制器的“每秒”速率限制,包括 HTTP 请求和排队作业的速率限制。以前,Laravel 的速率限制器仅限于“每分钟”粒度:

RateLimiter::for('invoices', function (Request $request) {
  return Limit::perSecond(1);

});

健康路由

新的 Laravel 11 应用程序包含一个health路由指令,它指示 Laravel 定义一个简单的运行状况检查端点,该端点可以由第三方应用程序运行状况监控服务或 Kubernetes 等编排系统调用。默认情况下,该路由的服务地址为/up:

->withRouting(
  web: __DIR__.'/../routes/web.php',

 commands: __DIR__.'/../routes/console.php',

 health: '/up',

)


当向此路由发出 HTTP 请求时,Laravel 还将调度一个DiagnosingHealth事件,允许您执行与应用程序相关的其他运行状况检查。

优雅的加密密钥轮换

由于 Laravel 会加密所有 cookie,包括应用程序的会话 cookie,因此基本上对 Laravel 应用程序的每个请求都依赖于加密。但是,正因为如此,轮换应用程序的加密密钥将使所有用户退出您的应用程序。此外,解密由先前加密密钥加密的数据变得不可能。

Laravel 11 允许您通过环境变量将应用程序以前的加密密钥定义为逗号分隔的列表APP_PREVIOUS_KEYS。

加密值时,Laravel 将始终使用环境变量中的“当前”加密密钥APP_KEY。解密值时,Laravel 将首先尝试当前密钥。如果使用当前密钥解密失败,Laravel 将尝试所有先前的密钥,直到其中一个密钥能够解密该值。

即使您的加密密钥发生轮换,这种优雅解密的方法也允许用户不间断地继续使用您的应用程序。

自动密码重新哈希

Laravel 的默认密码哈希算法是 bcrypt。 bcrypt 哈希的“工作因子”可以通过config/hashing.php配置文件或BCRYPT_ROUNDS环境变量进行调整。

通常,随着 CPU/GPU 处理能力的增加,bcrypt 工作因子应该随着时间的推移而增加。如果您增加应用程序的 bcrypt 工作系数,Laravel 现在将在用户通过您的应用程序进行身份验证时优雅地自动重新哈希用户密码。

及时验证

Laravel Prompts是一个 PHP 包,用于向命令行应用程序添加美观且用户友好的表单,具有类似浏览器的功能,包括占位符文本和验证。

Laravel Prompts 支持通过闭包进行输入验证:

$name = text(
  label: 'What is your name?',

 validate: fn (string $value) => match (true) {

strlen($value) < 3 => 'The name must be at least 3 characters.',

strlen($value) > 255 => 'The name must not exceed 255 characters.',

default => null

}

);


然而,在处理许多输入或复杂的验证场景时,这可能会变得很麻烦。因此,在 Laravel 11 中,您可以在验证提示输入时充分利用 Laravel验证器的全部功能:

$name = text('What is your name?', validate: [
             'name' => 'required|min:3|max:255',

]);

队列交互测试

以前,尝试测试排队作业是否被释放、删除或手动失败非常麻烦,并且需要定义自定义队列伪造品和存根。但是,在 Laravel 11 中,您可以使用以下方法轻松测试这些队列交互withFakeQueueInteractions:

use App\Jobs\ProcessPodcast;
$job = (new ProcessPodcast)->withFakeQueueInteractions();

$job->handle();

$job->assertReleased(delay: 30);


新Artisan命令

添加了新的 Artisan 命令以允许快速创建类、枚举、接口和特征:

php artisan make:class
php artisan make:enum
php artisan make:interface
php artisan make:trait

模型转换改进

Laravel 11 支持使用方法而不是属性来定义模型的强制转换。这允许简化、流畅的强制转换定义,特别是在使用带有参数的强制转换时:

/**
* Get the attributes that should be cast.

 * 有关属性转换的更多信息,请查看Eloquent 文档。

 * @return array<string, string>

*/

protected function casts(): array

{

return [

'options' => AsCollection::using(OptionCollection::class),

// AsEncryptedCollection::using(OptionCollection::class),

// AsEnumArrayObject::using(OptionEnum::class),

// AsEnumCollection::using(OptionEnum::class),

 ];

}



功能once

辅助once函数执行给定的回调,并在请求期间将结果缓存在内存中。任何once具有相同回调的函数的后续调用都将返回之前缓存的结果:

function random(): int
{

return once(function () {

return random_int(1, 1000);

});

}

random(); // 123

random(); // 123 (cached result)

random(); // 123 (cached result)

使用内存数据库进行测试时提高了性能

:memory:在测试期间使用 SQLite 数据库时,Laravel 11 提供了显着的速度提升。为了实现这一目标,Laravel 现在维护对 PHP PDO 对象的引用并跨连接重用它,通常会将总测试运行时间减少一半。

改进了对 MariaDB 的支持

Laravel 11 改进了对 MariaDB 的支持。在以前的 Laravel 版本中,您可以通过 Laravel 的 MySQL 驱动程序使用 MariaDB。然而,Laravel 11 现在包含一个专用的 MariaDB 驱动程序,它为该数据库系统提供了更好的默认值。有关 Laravel 数据库驱动程序的更多信息,请查看数据库文档。

检查数据库并改进架构操作

Laravel 11 提供了额外的数据库模式操作和检查方法,包括本机修改、重命名和删除列。此外,还提供了高级空间类型、非默认模式名称以及用于操作表、视图、列、索引和外键的本机模式方法:

use Illuminate\Support\Facades\Schema;
$tables = Schema::getTables();

$views = Schema::getViews();

$columns = Schema::getColumns('users');

$indexes = Schema::getIndexes('users');

$foreignKeys = Schema::getForeignKeys('users');