初識 Laravel 11

JaguarJack發表於2024-02-03

社群首當其衝。在去年年初,我就留意到泰勒(Taylor)在 X(推特) 平臺上宣佈了一個令人期待的計劃,即對 Laravel 進行精簡,力圖打造一個更為簡潔的骨架。經過 Laravel 開發組一年的辛勤努力,也隨著即將釋出的 Laravel 11,X 上各種關於 Laravel 11 的討論、分享也越來越多。我將這些資訊做了一個聚合,分享給社群的各位。

安裝

Laravel 11 最低版本要求 8.2 了,所以各位想要嚐鮮先提前準備下環境 😄

執行下面的命令安裝專案

composer create-project --prefer-dist laravel/laravel laravel-dev dev-master

如果遇到報錯,例如下面的,可以先不用管,是資料庫預設驅動的問題。

could not find driver (Connection: sqlite, SQL: PRAGMA foreign_keys = ON;)

在寫這篇文章的時候,Laravel 將 Database 的預設DB_CONNECTION設定成了 sqlite 導致的。不用管它,如果你不用 sqlite,建議設定成 Mysql。
先來看下目錄結構

|---- app/  應用目錄
|---- bootstrap/ 啟動目錄
|---- config/ 配置目錄
|---- database/ 資料遷移目錄
|---- public/ 入口
|---- resources/ 資源目錄,主要是檢視,靜態檔案
|---- routes/ 路由
|---- storage/ 儲存目錄
|---- tests/ 測試
|---- vendor/ 依賴目錄
|---- vite.config.js vite 配置
|---- artisan
|---- composer.json PHP 依賴
|---- package.json 前端依賴
|---- phpunit.xml
|---- README.md

app 目錄

根目錄的目錄結構沒有大的變化,但是子目錄的變化可大了。基本都給我們整沒了 😂,展開看下,這裡為了區別,只把變化的目錄留下。首先是 app 目錄

├─app 
│  ├─Http
│  │  └─Controllers
│  │          Controller.php
│  │         
│  ├─Models 
│  │      User.php 
│  └─Providers 
│          AppServiceProvider.php

app 目錄刪除了太多的東西了,大概有下面這些,以後都不用關注了

  • Consoles 控制檯 Kernel ❌
  • 異常 ❌
  • Http
    • 中介軟體全部取消 ❌
    • Http Kernel ❌
  • 服務提供者
    • 認證 ❌
    • 事件 ❌
    • 路由 ❌
    • Broadcast(廣播?) ❌

只保留了 AppServiceProvider 服務。還有就是提供的一個預設控制器,之前是這樣的

namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;

class Controller extends BaseController
{
    use AuthorizesRequests;
    use DispatchesJobs;
    use ValidatesRequests;
}

提供三個 Trait 組合,現在也全都沒了,只是一個 Controller, 如下

namespace App\Http\Controllers;

abstract class Controller
{
    //
}

bootstrap 目錄

下面來看 bootstrap 目錄的變化

├─bootstrap 
│  │  app.php 
│  │  providers.php 
│  │  
│  └─cache 
│          packages.php 
│          services.php 

bootstrap 的 cache 目錄是沒有啥變化的,變化所以新增了一個 providers 檔案,這是 Laravel 專案自動生成的檔案,裡面只有一個 AppServiceProvider 服務,應該並不是給使用者預留的,可以在裡面增加服務提供者,但是肯定不建議。個人認為這個檔案以後可能還會被刪除掉 😂。
因為這個檔案實在是很簡單,只是返回一個服務提供者陣列

return [
    App\Providers\AppServiceProvider::class,
];

然後就是 app.php 這個檔案變化蠻大的,先來看下之前的吧

// 註冊根目錄
$app = new Illuminate\Foundation\Application(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);

// 註冊 Http kernel
$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    App\Http\Kernel::class
);
// 註冊 Console kernel
$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class
);
// 註冊異常處理
$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class
);


return $app;

之前做了四件事

  • ☑️ 註冊根目錄
  • ☑️ 註冊 Http kernel
  • ☑️ 註冊 Console kernel
  • ☑️ 註冊異常處理

然後在 Laravel11 的新版本呢,大概是這樣的

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withProviders()
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        // api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        // channels: __DIR__.'/../routes/channels.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

目前來看只有兩個相同點,只是從當前檔案看到的

  • ☑️ 註冊根目錄
  • ☑️ 註冊異常處理(需要自己寫)

然後從 Application 核心看到的,其實核心中自動註冊了這些,這裡不用程式碼展示了,瞭解下就好了,感興趣可以看程式碼

  • ☑️ Http 和 Console 核心
  • ☑️ 事件服務提供者
  • ☑️ 註冊 app 目錄的 Console/Commands
  • ☑️ 中介軟體(指之前的 app 目錄的,已經全部移至核心)

這裡要特別提一點,雖然框架自動註冊了 app 目錄下的中介軟體,本來我們可以自由修改中介軟體程式碼或者使用不同的中介軟體,現在也是可以的,只不過需要你自己權衡了。在:

->withMiddleware(function (Middleware $middleware) {
    // 修改 golbal 中介軟體
    middleware->use(array $middleware)
    // 然後還有 api web 之類的都可以透過曝露的方法進行修改
})

config 目錄

配置目錄變化真大,啥都沒了。現在只用 env 就行了,管那麼多 config 檔案幹嘛,看的頭皮發麻。什麼 app,什麼 database 還有 session,queue。大部分時候都用不著。
但是如果你有特定需求,可以透過 config 釋出修改

 php artisan | grep config

找到這個命令

php artisan config:publish

如果想釋出全部配置檔案

php artisan config:publish --all

如果想釋出某個配置檔案,目前好像沒有提供哪些可用配置檔案的命令,這個可能會在檔案中提到。如果有需要,可以透過下面的命令釋出資料庫配置檔案(對老使用者比較友好)

php artisan config:publish database

預設配置檔案全部對使用者隱藏了,雖然如此,但實際上仍然全部載入了,這對新使用者是利好,省去了一些煩惱。

route 目錄

這個目錄沒啥說的,就是保留了 web 和 console 兩個路由。但是如果你是開發 api 專案,你可以使用下面的命令

php artisan install:api

這個命令會自動安裝 sanctum 包,並建立一個 api.php 路由檔案,示例如下:

Route::get('/user', function (Request $request) {
    return $request->user();
})->middleware(Authenticate::using('sanctum'));

總結

個人觀點是,某種意義上更加黑盒了。如果你不去了解原始碼,你根本不知道框架在背後做了什麼。這只是精簡骨架

但是,對於新使用者來說,這是好訊息。對於剛開始使用 Laravel 的使用者來說,不再需要去關心那麼多的概念,比如 Http 核心、中介軟體、服務提供者等。現在只需要一個 MVC 就可以開始開發應用了。這樣看來,框架更加漸進式了 😂。

簡而言之,這利好新使用者 👍。

原文連結

本作品採用《CC 協議》,轉載必須註明作者和本文連結