Laravel 6.5で追加されたメソッドを試してみた

# 参考

[Laravel v6.5.0 released](https://blog.laravel.com/laravel-v6-5-0-released)

私はLaravel初心者です。間違いなどありましたら教えていただけるとありがたいです。

# `LazyCollection::remember()`

https://github.com/laravel/framework/pull/30443

`remember()`を呼び出すと、コレクションの列挙を記憶する新しいLazyCollectionが返されます。

---

DBから取ってきた値をキャッシュして使いまわすことができる。

```php
        // LazyCollectionの例
        $todos1 = Todos::cursor();
        $todos1->all(); // データ取得
        $todos1->all(); // データ取得

        // LazyCollectionからremomberを呼び出した例
        $todos2 = Todos::cursor()->remember();
        $todos2->all(); // データ取得
        $todos2->all(); // rememberのキャッシュからデータ取得するのでsqlは実行しない
```

---

ジェネレーター関数でLazyCollectionを作成する例でも試してみました。

フィボナッチ数列を返す以下のジェネレータで確認します。
まず`remember()`を使わない例を確認します。

```php
        $fibonacci = LazyCollection::make(function () {
            echo 'ジェネレータ関数からをLazyCollection作成' . PHP_EOL;
            [$a, $b] = [0, 1];
            while (true)
                yield [$a, $b] = [$b, $a + $b];
        });

        foreach($fibonacci->take(5)->all() as [$a]) echo $a . PHP_EOL;
        echo '-----' . PHP_EOL;
        foreach($fibonacci->take(10)->all() as [$a]) echo $a . PHP_EOL;
```

```
ジェネレータ関数からをLazyCollection作成
1
1
2
3
5
-----
ジェネレータ関数からをLazyCollection作成
1
1
2
3
5
8
13
21
34
55
```

次に`remember()`を使った例をみてみます

```diff
        $fibonacci = LazyCollection::make(function () {
            echo 'ジェネレータ関数からをLazyCollection作成' . PHP_EOL;
            [$a, $b] = [0, 1];
            while (true)
                yield [$a, $b] = [$b, $a + $b];
-       });
+       })->remember();

        foreach($fibonacci->take(5)->all() as [$a]) echo $a . PHP_EOL;
        echo '-----' . PHP_EOL;
        foreach($fibonacci->take(10)->all() as [$a]) echo $a . PHP_EOL;
```

```
ジェネレータ関数からをLazyCollection作成
1
1
2
3
5
-----
1
1
2
3
5
8
13
21
34
55
```

`ジェネレータ関数からをLazyCollection作成` の部分が最初の一回だけ実行されています。
列挙した値(`yeild`で指定している値)をキャッシュして、2回目以降はその値を返すだけですので、このような動作になっているようです。

# `Str::afterLast()` `Str::beforeLast()`

https://github.com/laravel/framework/pull/30507

- `Str::afterLast()` 指定された値が最後に出現した後の文字列を返す
- `Str::beforeLast()` 指定された値が最後に現れる前の文字列を返す

```php
        $type = 'App\Notifications\Tasks\TaskUpdated';
        echo Str::afterLast($type, '\\') . PHP_EOL; // TaskUpdated
        echo Str::beforeLast($type, '\\') . PHP_EOL; // App\Notifications\Tasks

        $filename = 'photo.2019.11.04.jpg';
        echo Str::afterLast($filename, '.') . PHP_EOL; // jpg
        echo Str::beforeLast($filename, '.') . PHP_EOL; // photo.2019.11.04
```

# `existsOr()` `doesntExistOr()`

https://github.com/laravel/framework/pull/30495

今まではこう書いていたのを、

```php
        $has = Todos::exists();

        if ($has) {
            // Todosにデータがある場合の処理
        }
```

コールバック関数で書けるようになりました。

```php
        Todos::existsOr(function () {
            // Todosにデータがなければ実行される関数
        });

        Todos::doesntExistOr(function () {
            // Todosにデータがあれば実行される関数
        });
```

# Bladeのカスタム条件を定義することで使えるディレクティブに`unless`が追加

https://github.com/laravel/framework/pull/30492

まずBladeのカスタム条件を定義

参考：https://laravel.com/docs/5.8/blade#custom-if-statements

```./app/Providers/AppServiceProvider.php

use Illuminate\Support\Facades\Blade;

// ...

    public function boot()
    {
        Blade::if('env', function ($environment) {
            return app()->environment($environment);
        });
    }
```

これで `@名前`、`@else名前`、`@end名前`がbladeテンプレート内で使えるようになりました。
今回の例では `@env`、`@elseenv`、`@endenv` と書くことで使えます。

```php:blade
@env('local')
    // .envのAPP_ENVがlocal
@elseenv('testing')
    // .envのAPP_ENVがtesting
@else
    // その他
@endenv
```

6.5は↑にプラスして`@unless名前`(今回の例では`@unlessenv`)が新たに使えるようになりました。

```php:blade
@unlessenv('local')
    // .envのAPP_ENVがlocal以外
@endenv
```

---

以上です。見ていただいてありがとうございました。m(_ _)m