laravel 8 延续了 7 中的改进,包括 laravel Jetstream,模型工厂类,迁移压缩,任务批处理,速率控制优化,队列优化,动态 Blade 组建,Tailwind 分页视图,时间测试助手,artisan serve 服务器优化,事件监听器优化,以及其他各种 BUG 修复和可用性改进。
Laravel Jetstream
Laravel Jetstream 来自于 Laravel 之父 Taylor Otwell。它是一个设计的非常漂亮的 Laravel 应用程序脚手架。Laravel Jetstream 为你搭建你的下一个项目提供了一个完美的起点,它包含了:登录,注册,邮箱验证,双因素认证,会话管理,基于 Laravel Sanctum 的 API 管理,可选的团队管理。Laravel Jetstream 替代并改进了之前版本的认证 UI 脚手架。
Laravel Jetstream 是使用 Tailwind CSS 设计的,并提供 Livewire 和 Inertia 脚手架供选择。
Models 目录
由于大量的社区需求,默认的 Laravel 框架现在包含一个 app/Models 目录,我们希望你喜欢这个为你的模型文件准备的新家。所有相关的生成器命令都已经更新,假定你的模型文件存放在 app/Models 目录,当然前提是存在这个目录。如果不存在这个目录,框架会假定你的模型文件存在于 app 目录下。
模型工厂类
模型工厂类由 Taylor Otwell 贡献。
Elequent 模型工厂已经被完全重写为基于类的工厂,并进行了改进,以完美支持模型关联。例如,包含在 Laravel 中的 UserFactory 是这样写的:
<?PHP
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
class UserFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = User::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'name' => $this->faker->name,
'email' => $this->faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
}
}
因为生成的模型上提供了新的 HasFactory trait,模型工厂可以这样使用:
use App\Models\User;
User::factory()->count(50)->create();
因为模型工厂现在是简单的 PHP 类,状态转换可以写成类方法。除此之外,你也可以给你的Elequent 模型工厂添加任意你需要的工具类。
例如,你的 User 模型可能有个属性值需要修改为 suspended,你可以使用工厂的 state 方法来定义这个状态转移。你可以随意命名你的方法,毕竟这就是一个典型的 PHP 方法。
/**
* Indicate that the user is suspended.
*
* @return \Illuminate\Database\Eloquent\Factories\Factory
*/
public function suspended()
{
return $this->state([
'account_status' => 'suspended',
]);
}
定制好状态转移方法后,我们就可以这么使用:
use App\Models\User;
User::factory()->count(5)->suspended()->create();
像之前说到的,Laravel 8 的模型工厂包含了对模型关联的完美支持。现在假定我们的 User 模型有一个 Posts 关联方法,我们只需要执行下面的代码就可以生成一个有 3 篇文章的用户。
$users = User::factory()
->hasPosts(3, [
'published' => false,
])
->create();
为了简化升级过程,我们发布了一个 laravel/legacy-factories 扩展包,可以在Laravel 8中支持以前的模型工厂。
重写版的模型工厂还包含了很多特性,我们相信你会喜欢的。想了解更多的话,请查看文档 https://laravel.com/docs/8.x/database-testing#creating-factories
迁移压缩
迁移压缩由Taylor Otwell 贡献。
在你开发应用的过程中,随着时间的推移,你的迁移文件可能会累积的越来越多,导致你的迁移目录变得非常臃肿。现在,如果你愿意的话,你可以把你的迁移文件压缩成一个 SQL 文件。执行 schema:dump 即可:
php artisan schema:dump
// Dump the current database schema and prune all existing migrations...
php artisan schema:dump --prune
执行完这条命令,Laravel 将会在你的 database/schema 目录写入一个 “schema” 文件。现在,当你执行数据库迁移时,Laravel 将会先执行 schema 文件中的 SQL,再执行不包含在 schema 中的剩余迁移。
任务批处理
任务批处理由 Taylor Otwell 和 Mohamed Said 共同贡献。
Laravel 的任务批处理特性让你可以简单地执行批量任务,然后在批量任务执行完成后再执行一些操作。
Bus facade 中新增了一个 batch 方法可以用来执行批量任务,当然,批处理主要是和回调结合使用的。所以。你可能需要使用 then,catch,finally 方法来定义完整的回调。这三种回调任意一个被调用时都会接收到一个 Illuminate\Bus\Batch 实例。
use App\Jobs\ProcessPodcast;
use App\Podcast;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Batch;
use Throwable;
$batch = Bus::batch([
new ProcessPodcast(Podcast::find(1)),
new ProcessPodcast(Podcast::find(2)),
new ProcessPodcast(Podcast::find(3)),
new ProcessPodcast(Podcast::find(4)),
new ProcessPodcast(Podcast::find(5)),
])->then(function (Batch $batch) {
})->catch(function (Batch $batch, Throwable $e) {
})->finally(function (Batch $batch) {
})->dispatch();
return $batch->id;
想了解更多关于批处理,请访问文档 https://laravel.com/docs/8.x/queues#job-batching
速率限制优化
速率限制优化由 Taylor Otwell 贡献。
Laravel的请求速率限制器特性得到了增强,具有更好的灵活性和更强大的功能,同时兼容上一个版本的 throttle 中间件。
使用 RateLimiter facade 的 for 方法来定义一个速率限制器。for 方法第一个参数是速率限制器名称,第二个参数是一个闭包函数,闭包函数返回速率限制器的配置。
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
RateLimiter::for('global', function (Request $request) {
return Limit::perMinute(1000);
});
因为速率限制器的回调接收到的是一个 HTTP 请求实例,你可以基于请求或当前认证的用户来动态设置速率限制。
RateLimiter::for('uploads', function (Request $request) {
return $request->user()->vipCustomer()
? Limit::none()
: Limit::perMinute(100);
});
有时你可能希望根据一些特定的值来进行速率限制。比如你希望限制i用户每分钟内每个IP地址最多发起100次请求,使用 by 方法来实现这一功能;
RateLimiter::for('uploads', function (Request $request) {
return $request->user()->vipCustomer()
? Limit::none()
: Limit::perMinute(100)->by($request->ip());
});
使用 throttle 中间件将刚刚创建的速率限制器绑定到路由或者路由组就可以了。将你设定的速率限制器名称传入中间件来指定使用哪个速率限制器:
Route::middleware(['throttle:uploads'])->group(function () {
Route::post('/audio', function () {
});
Route::post('/video', function () {
});
});
想了解更多关于速率限制器,请查看文档:https://laravel.com/docs/8.x/routing#rate-limiting
维护模式优化
维护模式优化由 Taylor Otwell 贡献,灵感来源于 Spatie。
在之前的 Laravel 版本中,php artisan down 开启的维护模式可以通过建立一个 IP 地址白名单来绕过,在白名单中的 IP 地址可以正常访问应用。在新版本中这个特性被移除了,取而代之的是一个简单的 token 方案。
在维护模式下,你可以通过 secret 选项生成一个可以绕过维护模式的 token:
php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"
将应用设置为维护模式后,你可以带上这个 token 访问应用程序的 URL,然后 Laravel 将会在浏览器中写入一个能绕过维护模式的 cookie:
https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515
通过这个隐藏路由,你会被重定向到应用的 / 路由。一旦 cookie 被写入浏览器,你就可以像没开启维护模式一样正常的访问应用。
预渲染维护模式视图
如果你在部署期间使用了 php artisan down,你的用户又在更新 composer 依赖或其他基础视图时访问应用,可能偶尔还是会出错。出现这种情况是因为 Laravel 必须启动先启动一些核心的功能,来确定你的应用是否处于维护模式,然后用模板引擎渲染维护模式视图。
由于这个原因,Laravel 现在允许你在请求的生命周期的最开始预渲染一个维护模式视图。这个视图会在应用的任何依赖加载之前渲染。你可以使用 down 命令的 render 选项选择一个预渲染模板:
php artisan down --render="errors::503"
Closure Dispatch / Chain catch
Catch 优化由 Mohamed said 贡献。
使用新增的 catch 方法,你现在可以规定一个闭包函数来监听某个闭包队列。当闭包队列耗尽了队列配置的所有重置次数后还没有完全成功,就执行闭包函数:
use Throwable;
dispatch(function () use ($podcast) {
$podcast->publish();
})->catch(function (Throwable $e) {
});
动态 Blade 组件
动态 Blade 组件由 Taylor Otwell 贡献。
有时你需要渲染一个组件,但是不确定在运行时应该渲染哪个组件。在这种情况下,你现在可以使用 Laravel 内置的 dynamic-component 组件去根据运行时的某个值或某个变量来动态渲染组件:
<x-dynamic-component :component="$componentName" class="mt-4" />
想了解更多关于 Blade 组件,请查看文档:https://laravel.com/docs/8.x/blade#components
事件监听器优化
事件监听器优化由 Taylor Otwell 贡献
现在可以通过给 Event::listen 方法传入一个闭包函数来简单的注册一个基于闭包的事件监听器。Laravel 会检查闭包以确定监听器处理的事件类型。
use App\Events\PodcastProcessed;
use Illuminate\Support\Facades\Event;
Event::listen(function (PodcastProcessed $event) {
});
除此之外,基于闭包的事件监听器现在可以使用 Illuminate\Events\queueable 方法标记为可队列化的:
use App\Events\PodcastProcessed;
use function Illuminate\Events\queueable;
use Illuminate\Support\Facades\Event;
Event::listen(queueable(function (PodcastProcessed $event) {
}));
就像队列任务一样,你可以使用 onConnection,onQueue,和 delay 方法定制如何执行队列监听器:
Event::listen(queueable(function (PodcastProcessed $event) {
})->onConnection('redis')->onQueue('podcasts')->delay(now()->addSeconds(10)));
如果你想对匿名队列监听器进行异常处理,你可以在定义 queueable 监听器时使用 catch 方法并传入一个闭包函数来实现:
use App\Events\PodcastProcessed;
use function Illuminate\Events\queueable;
use Illuminate\Support\Facades\Event;
use Throwable;
Event::listen(queueable(function (PodcastProcessed $event) {
})->catch(function (PodcastProcessed $event, Throwable $e) {
}));
时间测试工具
时间测试工具由 Taylor Otwell 贡献,灵感来自于 Ruby on Rails
在测试时,你可能偶尔需要修改now 或者 Illuminate\Support\Carbon::now() 返回的时间。Laravel 的基础测试类现在包含了一个可以操作时间的工具:
public function testTimeCanBeManipulated()
{
$this->travel(5)->milliseconds();
$this->travel(5)->seconds();
$this->travel(5)->minutes();
$this->travel(5)->hours();
$this->travel(5)->days();
$this->travel(5)->weeks();
$this->travel(5)->years();
$this->travel(-5)->hours();
$this->travelTo(now()->subHours(6));
$this->travelBack();
}
Artisan serve 优化
Artisan serve 优化由 Taylor Otwell 贡献
现在,优化后的 Artisan serve 命令可以监听本地 .env 文件中的环境变量的修改,并自动重新加载。以前则必须手动重启。
Tailwind 分页视图
Laravel 的分页器现在默认使用 Tailwind CSS 框架。Tailwind CSS 是一个轻量级的,高度可定制的CSS 框架,它提供了构建一个定制化设计所需要的所有模块,并且没有烦人的不得不覆盖掉的样式。当然了,你仍然可以选择使用 Bootstrap 3 或 4。
İstanbul hurdacısı olarak tonajlı hurda alıyoruz. İstanbuldaki geri dönüşüm tesisleri arasında kaliteli hizmetlerimizle öncülük ediyoruz.
pendik hurdacı firmasıyız. pendik hurdacı hurda fiyatları ile yerinden hurda alan istanbul pendik hurdacı firmasıyız.
Hurda bakır alan istanbul Esenyurt hurdacı firması olarak her türlü madeni değerinde alıyoruz..
好
支持一下