📘

Laravel v11.0.3 まとめ

2024/10/02に公開

30minで読めるだけ読んだので、全部のリリースはまとめきれてないこともあります。

リリースノートはこちら

  • [11.x] Arr helper map spread by @bilfeldt in #50474
  • [11.x] add list rule by @medilies in #50454
  • [11.x] Fixes installation of passport by @nunomaduro in #50488

[11.x] Arr helper map spread by @bilfeldt in #50474

CollectionのmapSpreadというメソッドをArrヘルパーに実装したらしい。
そもそもmapSpreadを使ったことがないのでドキュメントを見てみる。
https://laravel.com/docs/11.x/collections#method-mapspread

ドキュメントに書かれているコードにちょっとコメントを追記したのが下記。

$collection = collect([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
 
$chunks = $collection->chunk(2);

// 中身が想像できなかったので吐き出してみた
/**
 * [
 *  [
 *      0,
 *      1,
 *  ],
 *  [
 *      2 => 2,
 *      3 => 3,
 *  ],
 *  [
 *      4 => 4,
 *      5 => 5,
 *  ],
 *  [
 *      6 => 6,
 *      7 => 7,
 *  ],
 *  [
 *      8 => 8,
 *      9 => 9,
 *  ],
 * ]
 */

$sequence = $chunks->mapSpread(function (int $even, int $odd) {
    return $even + $odd;
});
 
$sequence->all();
 
// [1, 5, 9, 13, 17]

chunkが連想配列と配列が混じった不思議な挙動するな...
まあ、単純にcollectionの中のcollectionに対してそれぞれ操作を行なって新しいcollectionを作る感じらしいです。

それのArrayヘルパーでの実装がこのPR。
ちなみにドキュメントに使い方も追加していて、chunk使ってない分こっちの方がわかりやすいかも。
https://laravel.com/docs/11.x/helpers#method-array-map-spread

[11.x] add list rule by @medilies in #50454

Validationのルールで、arrayというルールが存在するが、arrayだと下記の1と2のどちらもパスしていた。新たに作られたlistというルールだと、2だけしかパスしなくなる。

1. ['foo' => [1 => 1, 2 => 2]]
2. ['foo' => [1, 2, 3]]

[11.x] Fixes installation of passport by @nunomaduro in #50488

今までの書き方だと、sail artisan install:api --passport 実行時にpassportがまだロードされていない可能性があったため、落ちていたっぽい。

というのも、passportがパッケージとしてインストールされていない場合、このコマンド実行時に最初の方でインストールされる。ただ、そのまま$this->call('passport:install')でpassportを呼び出そうとしても元のプロセスではパスポートがインストールされた後のautoloadを読み取れてないのでバグるっぽい?(autoloadの認識が雑なので間違っていたらすみません)

再現してみた

まずは適当にLaravelの環境を用意して、composer.jsonに書かれているLaravelのバージョンをv11.0.2に固定する。

--- a/composer.json
+++ b/composer.json
@@ -7,7 +7,7 @@
     "require": {
         "php": "^8.2",
         "inertiajs/inertia-laravel": "^1.3",
-        "laravel/framework": "^11.9",
+        "laravel/framework": "11.0.2",
         "laravel/tinker": "^2.9"
     },

そのままsail artisan install:api --passportと入力する。

$ sail artisan install:api --passport
(省略)
 Would you like to use UUIDs for all client IDs? (yes/no) [no]:
 > yes


   ERROR  There are no commands defined in the "passport" namespace.

こんな感じで落ちる。

これがv11.0.3だと修正されている。
修正されていることを確認してみる。
ただ、すでにpassportがインストールされているとそもそもバグが再現しないので、一旦vendorは吹き飛ばしてもう一度git reset --hard && git clean -fd && composer installなどをかけておく必要があります。

上記の諸々をやったあと、Laravelのバージョンをv11.0.3に固定して、

$ sail artisan install:api --passport

 Would you like to use UUIDs for all client IDs? (yes/no) [no]:
 > yes

   INFO  API scaffolding installed. Please add the [Laravel\Passport\HasApiTokens] trait to your User model.

バッチリ直ってますね。

GitHubで編集を提案

Discussion