Laravel8路由问题解决方法

简介关于Laravel8路由问题的变动,不知道你是否有不习惯,反正我是不习惯。Laravel8中的路由按照我们之前的习惯来写,你会惊奇的发现,报错了。会产生一种摸不着头脑的感觉。

关于Laravel8路由问题的变动,不知道你是否有不习惯,反正我是不习惯。Laravel8中的路由按照我们之前的习惯来写,你会惊奇的发现,报错了。会产生一种摸不着头脑的感觉。

按照官方推荐的写法来编码自然是不会报错的,但是,如果还是按照Laravel8之前的写法来编码就有问题了。那么如何解决问题?

先来写写官方推荐的写法:

官方推荐写法

routes/web.php

<?php

use Illuminate\Support\Facades\Route;

# 引入控制器文件
use App\Http\Controllers\IndexController;

# 路由文件
Route::get('/' , [IndexController::class , 'index']);

IndexController 控制器文件

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;

class IndexController extends Controller
{
public function index() {
 return 'hello IndexController';
}
   
public function test() {
 return 'test';
}
}

这是IndexController所对应的路由及其文件。如果现在有个文章控制PostController文件,那么就需要再路由文件中引入这个控制器,然后再定义相关的路由。要是有N多个控制器文件,那么就需要在web.php文件中引入N多个控制器,给人感觉就已经不简洁了。

web.php

<?php
use App\Http\Controllers\PostController;
use App\Http\Controllers\TagController;

Route::get('post/lst' , [PostController::class , 'index']);
Route::get('tag/lst' , [TagController::class , 'index']);

下面就是按照以前的写法的解决方法

Laravel8之前的写法

第一步:打开 App\Providers\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
{
   # 添加该属性就可以按照之前习惯的写法编码了
   protected $namespace = "App\Http\Controllers";
...
}

第三步:实测

web.php

<?php

use Illuminate\Support\Facades\Route;

Route::get('test' , 'IndexController@index');

Laravel8的那些新特性

新特性概览

声明:Laravel 8 于 2020 年 9 月 8 日正式发布,不是 LTS 版本,所以 bug 修复支持会持续半年,到 2021 年 3 月 8 日,也就是下一个主版本 Laravel 9 发布前后,安全修复则会持续一年,到 2021 年 9 月 8 日。

Laravel 8 在 Laravel 7.x 版本基础上继续进行优化,主要包含了以下更新:

  • Laravel Jetstream
  • 模型工厂类
  • 迁移文件压缩
  • 任务批处理
  • 访问频率限制优化
  • 队列功能优化
  • 动态 Blade 组件
  • Tailwind 分页视图
  • 时间相关的测试辅助函数
  • artisan serve 命令优化
  • 事件监听器优化
  • 其他 bug 修复和可用性优化

其中比较重要的改进就是Laravel jetstream和模型工厂类

Laravel Jetstream

模型工厂类

Eloquent 模型工厂被重构为基于类进行管理,并且被优化为直接支持关联关系,例如,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),
        ];
    }
}

而由于模型类中包含了HasFactoryTrait:

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use HasFactory, Notifiable;
    
    ...

因此,可以这样调用模型工厂:

use App\Models\User;

User::factory()->count(50)->create();

由于模型工厂现在是简单的 PHP 类,因此状态转换可以通过类方法的方式实现。此外,你还可以按照需要添加任意其它的辅助类到 Eloquent 模型工厂。

例如,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关联方法,我们可以简单运行如下代码来生成一个拥有三篇文章的用户:

$users = User::factory()
            ->hasPosts(3, [
                'published' => false,
            ])
            ->create();