2011年6月に最初のVersionがリリースされてから12年。ついにLaravelも大台のVersion 10 を迎える事となりましたね。(パチパチパチ!!)という事でいつも通りinstallしてキャッチアップです。

サポート

サポートの予定については上の表の通りです。L8.xのリリース以降1年毎のバージョンアップとなっている為、次のL11.xのリリースが2024年初旬に控えていますね。明確な時期は未定の様ですが。前回のL9.xのインストール解説時にも触れましたが、L10.xからはPHP8.1以上が必須です、それ以前のバージョンを使用している方はアップグレードが必要となります。macOS環境の方は以前紹介したphpbrewを使えば複数のバージョンをinstallして切り替えて使えるので便利ですよ。

新規プロジェクト作成

それではいつも通りプロジェクトを作成してみましょう。

composer create-project laravel/laravel L10.x

プロジェクトディレクトリへ移動し、インストールされたLaravelのバージョンを確認してみます。2023年8月1日現在、10.16.1がインストールされました。

cd L10.x
php artisan --version
>> Laravel Framework 10.16.1

続いて、ビルドインサーバを立ち上げて見ます。

php artisan serv

ブラウザで http://127.0.0.1:8000/にアクセスし、お馴染みの画面が表示されました。

ここまではL9.xから特に変わり無いようです。

langディレクトリ

インストールしてみて気づいたのですが、プロジェクトのルートディレクトリからlangが無くなっています。langはL9.xでresources配下からルートディレクトリに移動したばかりです、今度はどこへ行ってしまったのでしょう?と、探していたらアップグレードガイドに記載がありました。

https://laravel.com/docs/10.x/upgrade#language-directory

新規プロジェクトを作成した初期状態ではlangディレクトリは作成されなくなったようです。従ってバリデーションエラーなどを日本語に変えたい場合などは

php artisan lang:publish

>>    INFO  Language files published successfully.  

を実行してプロジェクトにlangディレクトリに追加する必要があります。

testの–profileオプション

リリースノートを眺めていて使えるかも?と、思った新機能です。テスト実行時に--profileオプションを付けると遅いテストを表示してくれるようです。試しに、SlowTestというテストクラスにて、sleep()を使用して時間が掛かるテストを追加して実行してみました。

以下が追加したテスト

<?php

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;

class SlowTest extends TestCase
{
    public function test_that_takes_3_seconds(): void
    {
        sleep(3);
        $this->assertTrue(true);
    }

    /**
     * @dataProvider provider_test_that_takes_x_seconds
     */
    public function test_that_takes_x_seconds($seconds): void
    {
        sleep($seconds);
        $this->assertTrue(true);
    }

    public function provider_test_that_takes_x_seconds(): array
    {
        return [
            '1sec' => [1],
            '2sec' => [2],
            '5sec' => [5],
        ];
    }
}

以下が--profileを付けて実行した結果です。

php artisan test --profile

>> PASS  Tests\Unit\ExampleTest
  ✓ that true is true

   PASS  Tests\Unit\SlowTest
  ✓ that takes 3 seconds                                                                                                                                                                    3.01s  
  ✓ that takes x seconds with data set "1sec"                                                                                                                                               1.00s  
  ✓ that takes x seconds with data set "2sec"                                                                                                                                               2.01s  
  ✓ that takes x seconds with data set "5sec"                                                                                                                                               5.00s  

   PASS  Tests\Feature\ExampleTest
  ✓ the application returns a successful response                                                                                                                                           0.15s  

  Tests:    6 passed (6 assertions)
  Duration: 11.28s

  Top 10 slowest tests:
  Tests\Unit\SlowTest > that takes x seconds with data set "5sec"                                                                                                                           5.00s  
  Tests\Unit\SlowTest > that takes 3 seconds                                                                                                                                                3.01s  
  Tests\Unit\SlowTest > that takes x seconds with data set "2sec"                                                                                                                           2.01s  
  Tests\Unit\SlowTest > that takes x seconds with data set "1sec"                                                                                                                           1.00s  
  Tests\Feature\ExampleTest > the application returns a successful response                                                                                                                 0.15s  
  Tests\Unit\ExampleTest > that true is true                                                                                                                                                0.00s  
  ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────  
                                                                                                                                                                        (99.17% of 11.28s) 11.19s 

なるほど、テスト実行結果の後に遅いテストランキングを表示してくれる訳ですね。dataProviderでデータセットを指定している場合は、使用したデータ毎に実行時間を計測しランキングに反映されます。止むを得ず時間が掛かってしまうテストはどうしようも無いですが、単純に色々詰め込みすぎて遅くなっているテストが見つかったなら、分けることが出来ないか検討する良い機会だと思います。肥大化したテストは管理が大変ですから。

その他

リリースノートを眺めていて他に気になった新機能としてLaravel PennantProcessファサードがあります。現時点では、Laravel Pennantはフラグ管理機能、Processファサードはshellコマンドなどが実行できるFacadeという認識です。いずれも従来は自作のヘルパ関数を作ったり、cmd()を使ったりと、Laravelishではない方法で対応してきました。新機能を使う事でどう変わるのか気になる処です。これらについては別の記事でコードを交えながら噛み砕いていきたいと思います。

By hikaru