開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. Laravel >
  5. 【Laravel 9】Laravel 9に追加されたメソッドをいくつか試してみた

【Laravel 9】Laravel 9に追加されたメソッドをいくつか試してみた

こんにちは、モリです。
Laravel 9.xに新機能が日々追加されていますが、今回は9.13リリースの中から個人的に気になった、使いたいものをいくつか紹介したいと思います。
 

環境

  • PHP: 8.1
  • Laravel Framework 9.19.0

Collectionにvalue()メソッドが追加

$employees = new Collection(
    [
        ['id' => 1, 'name' => 'yamada'],
        ['id' => 2, 'name' => 'tanaka']
    ]
);

dd($employees->value('name'));

// yamada
まずは、Collectionクラスに新たに追加されたvalue()です。
上記のように、value()はコレクションの中から指定したキーをもつ最初の要素を取得し、その値を取得します。

ちなみに内部的にfisrtWhereを使用していて、
public function value($key, $default = null)
{
    if ($value = $this->firstWhere($key)) {
        return data_get($value, $key, $default);
    }

    return value($default);
}
指定したキー値がnullの要素は取得されません。
$employees = new Collection(
    [
        ['id' => 1, 'name' =>null],
        ['id' => 2, 'name' => 'tanaka']
    ]
);

dd($employees->value('name'));

// tanaka

TestResponseクラスにassertJsonMissingPath()メソッドが追加

次はテストのassertionに新たなメソッドが追加されたのでそちらをご紹介します。
{
  "employee": {
    "id": 1,
    "name": "山田",
    "department" : "営業部"
  }
}
上記のようなJSONレスポンスが返される場合を考えます。
指定のプロパティが含まれていないことをテストする場合、これまでであれば次のようなテストを書いていたでしょうか。
$this->assertFalse(array_key_exists('email', $response->json('employee')));

//  レスポンスに'email'が含まれないためテストは通ります
今回追加されたassertJsonMissingPathを使用すると次のようになります。
$response->assertJsonMissingPath('employee.email');

テストコードは全体的に長くなりがちなので、利用できるassertionメソッドは積極的に利用して、シンプルにしたいところです。

TestResponseクラスにcollect()メソッドが追加

続きましてもTestResponseクラスに関するものです。
先程と同じJSONレスポンスが返されるとして、collect()メソッドを使用するとレスポンスボディをコレクションとして取得することができます。
dd($response->collect());

// 以下のコレクションを取得する
Illuminate\Support\Collection {#1
  #items: array:1 [
    "employee" => array:3 [
      "id" => 1
      "name" => "山田"
      "department" => "営業部"
    ]
  ]
  #escapeWhenCastingToString: false
}
下記のような書き方をしなくて済みますね。
collect($response->json())
また、キーを指定することで指定したitemのコレクションを取得できます。
dd($response->collect('employee'));

// 以下のコレクションを取得
Illuminate\Support\Collection {#2
  #items: array:3 [
    "id" => 1
    "name" => "山田"
    "department" => "営業部"
  ]
  #escapeWhenCastingToString: false
}

ヘルパ関数にArr::map()が追加

最後にご紹介するのは、値とキーをコールバックに渡し配列を繰り返し処理する、Arr::map()です。
配列の繰り返し処理自体は、PHP関数のarray_map()でも可能です。
ただarray_map()のみではキーの取得ができないため、array_keysなども併用する必要があります。
そこで配列を一旦Collection化しmapメソッドを利用して繰り返し処理を行うことも多いです。

$data = ['name' => 'yamada', 'age' => 20];
$collection = collect($data);
$mapped = $collection->map(function ($item, $key) {
    return $key . 'は' . $item . 'です。';
})->toArray();

dd($mapped);

// 繰り返し処理後
[
  "name" => "nameはyamadaです。"
  "age" => "ageは20です。"
]

あくまで配列形式で取得したいのであればtoArray()で配列に戻す必要がありますね。
しかし今回追加されたArr::map()は配列のまま、コレクションのmap()メソッドと同じように繰り返し処理を行うことができます。(第一引数に配列、第二引数にコールバックを渡します)

$mapped = Arr::map($data, function ($value, $key) {
    return $key . 'は' . $value . 'です。';
});

Arr:map()の内部処理を見ておきます。

public static function map(array $array, callable $callback)
{
    $keys = array_keys($array);

    try {
        $items = array_map($callback, $array, $keys);
    } catch (ArgumentCountError) {
        $items = array_map($callback, $array);
    }

    return array_combine($keys, $items);
}

array_keys, array_map, array_combineを使っています。自前でこれらを書かなくてすみますね。

参考:https://laravel-news.com/laravel-9-13-0

最後に

今回は、Laravel 9.13リリースで追加されたメソッドについてご紹介しました。
細かい機能追加ではありますが、メソッドの存在を覚えておき適切に使用することでよりすっきりとしたコードになると思います。
以上となります。ありがとうございました。

 
TOPに戻る