新版本在模型中添加了更多的增强函数,.env,rate limiting,route cacheing,factory,controller namespace命名空间等。
*)默认Model模型目录
Laravel 8版本将为所有Eloquent模型创建新目录"Models"。
目前,所有模型都是默认存储在app/user.php,app/post.php等文件夹中。但是Laravel 8提供新目录"Models"以将所有模型存储在该文件夹。
旧Model路径:
app/User.php
app/Post.php
新Model路径:
app/Models/User.php
app/Models/Post.php
*)增强PHP Artisan服务
php artisan serve
在Laravel8之前,你在.env配置了变量值,需要重新服务命令,在Laravel8中,变量值将自动更新。
*)删除控制器命名空间前缀
Laravel 8从以前版本的Laravel中删除了来自RouteserviceProvider.php文件的$名称空间变量前缀。因此,基本上它将自动将"App\Htpp\Controllers"命名空间应用于控制器。
旧文件 RouteServiceProvider.php:
<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
/**
* This namespace is applied to your controller routes.
*
* In addition, it is set as the URL generator's root namespace.
*
* @var string
*/
protected $namespace = 'App\Http\Controllers';
/**
* The path to the "home" route for your application.
*
* @var string
*/
public const HOME = '/home';
....
新文件 RouteServiceProvider.php:
<?php
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
/**
* The path to the "home" route for your application.
*
* This is used by Laravel authentication to redirect users after login.
*
* @var string
*/
public const HOME = '/home';
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::middleware('web')
->group(base_path('routes/web.php'));
Route::prefix('api')
->middleware('api')
->group(base_path('routes/api.php'));
});
}
....
*)增强速率限制
速率限制可以在路由中。也可以应用到中间件中,以便设置每次的请求数。
RouteServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
/**
* The path to the "home" route for your application.
*
* This is used by Laravel authentication to redirect users after login.
*
* @var string
*/
public const HOME = '/home';
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
RateLimiter::for('uploadFile', function (Request $request) {
Limit::perMinute(8)->by($request->ip()),
});
RateLimiter::for('downloadFile', function (Request $request) {
if ($request->user()->isSubscribed()) {
return Limit::none();
}
Limit::perMinute(8)->by($request->ip()),
});
$this->configureRateLimiting();
$this->routes(function () {
Route::middleware('web')
->group(base_path('routes/web.php'));
Route::prefix('api')
->middleware('api')
->group(base_path('routes/api.php'));
});
}
/**
* Configure the rate limiters for the application.
*
* @return void
*/
protected function configureRateLimiting()
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60);
});
}
}
使用速率限制(Rate Limit)
Route::get('upload','[email protected]')->->middleware('throttle:uploadFile');
Route::get('download','[email protected]')->->middleware('throttle:downloadFile');
/* or use it no group */
Route::middleware(['throttle:uploadFile'])->group(function () {
});
*)Route Caching 增强
我们使用"php artisan route:cache"命令缓存路由。在laravel的早期版本中,缓存路由后,如果您要添加新路由,那么将需要执行手动清除再生成命令。但在Laravel8中自动将新路由添加到缓存文件中。
*)更新分页设计
laravel 8默认的分页类已删除,使用tailwind框架作为默认分类.。如果要使用Bootstrap框架,则需要在AppServiceProvider文件中调用"useBootstrap()"。
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Pagination\Paginator;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Paginator::useBootstrap();
}
}
*)更新关闭事件侦听器
Laravel 8更改了语法来调用事件侦听器。所以我可以向你展示具有旧语法的示例:
旧语法:
Event::listen(OrderShipped::class, function(OrderShipped $event) {
//Do something
});
新语法:
Event::listen(function(OrderShipped $event) {
/* Do something */
});
*)队列事件监听器
当调用模型创建(creating),创建(created),更新(updating),更新(updated)等事件时,可以轻松地将其排入队列。
让我们来看一个例子:
Product Model:
class Product extends Model {
protected static function booting()
{
static::created(queueable(function(Product $product) {
/* Write something Here */
}))
static::updated(queueable(function(Product $product) {
/* Write something Here */
}))
}
}
*)维护模式:密码访问
如果您想要网站关闭和开启,那么我们正在使用以下命令:
php artisan down
php artisan up
Laravel 8提供了一种方法,可以为很多人授予访问权限的密码。您可以使用密码并忽略cookie,因此直到您的网站启动,他们才可以访问旧版本。
php artisan down --secret=new-pass
现在它将创建新的路由,如果您访问此路由,则它将忽略cookie并通过以下URL访问网站:
https://www.example.com/new-pass
*)维护模式:预呈现页面
Laravel 8添加了新选项,可以在您的网站关闭时立即返回页面。您可以将render选项与文件路径一起使用,它将显示该文件,直到网站上线(up):
php artisan down --render="errors::backSoon"
您也可以使用命令:
php artisan down --redirect=/ --status=200 --secret=myPassword --render="errors::503"
*)队列批处理
Laravel 8提供了新函数“排队作业批处理",因此您可以一次将多个作业批量添加到队列中。有一个then(),catch()和finally()回调将在所有作业完成时触发。
Bus::batch([
new SendMailJob(),
new SendMailJob(),
new SendMailJob(),
new SendMailJob(),
new SendMailJob(),
])->then(function(Batch $batch){
//队列执行成功时调用
})->catch(function(Batch $batch) {
//队列执行失败时调用
})->finally(function(Batch $batch) {
//不管失败还是成功都会调用
})->dispatch();
*)队列backoff()
当您可以在Queue作业类中定义时,Laravel 8添加了新的方法backoff()。您可以使用数组定义编号时间以设置重试时间。
您可以像下面这样工作:
class ExampleJob
{
/**
* Calculate the number of seconds to wait before retrying the job.
*
* @return array
*/
public function backoff()
{
return [1, 5, 10];
}
....
}
*)Laravel Factory
Laravel 8模型对工厂进行了改进,因此您可以轻松地从工厂创建新的虚拟记录。他们添加了新的times(),以便您可以定义创建的记录数选项。
Route::get('test-factory',function(){
return User::factory()->create();
});
laravel 8添加了更多函数,您还可以从此处查看laravel 8升级指南:Laravel升级指南。