社群首當其衝。在去年年初,我就留意到泰勒(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 協議》,轉載必須註明作者和本文連結