Posted at

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


参考

Laravel v6.5.0 released

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


LazyCollection::remember()

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

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


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

        // LazyCollectionの例

$todos1 = Todos::cursor();
$todos1->all(); // データ取得
$todos1->all(); // データ取得

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


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

フィボナッチ数列を返す以下のジェネレータで確認します。

まずremember()を使わない例を確認します。

        $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()を使った例をみてみます

        $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() 指定された値が最後に現れる前の文字列を返す

        $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

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

        $has = Todos::exists();

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

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

        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 と書くことで使えます。


blade

@env('local')

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

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


blade

@unlessenv('local')

// .envのAPP_ENVがlocal以外
@endenv


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