この記事ではLaravel5.8で加わった、抑えておきたい新機能・変更点を紹介します。

Carbon2を新たにサポート!
個人的に最も期待していたのがこの変更です。
Carbon2がサポートされるようになり、Carbonをイミュータブルにすることができるようになりました。
Carbon1の場合、下記のように生成したインスタンスに対して例えば”addDays”を使ってインスタンスを取得した場合、元のインスタンスの日時も変更されていました。
$today = \Carbon\Carbon::today();
dump($today);
// => Carbon\Carbon @1554217200 {#4598
// date: 2019-04-03 00:00:00.0 Asia/Tokyo (+09:00),
// }
$tenDaysLater = $today->addDays(10);
// => Carbon\Carbon @1555081200 {#4598
// date: 2019-04-13 00:00:00.0 Asia/Tokyo (+09:00),
// }
dump($tenDaysLater);
// => Carbon\Carbon @1555081200 {#4598
// date: 2019-04-13 00:00:00.0 Asia/Tokyo (+09:00),
// }
dump($today);
// => Carbon\Carbon @1555081200 {#4598
// date: 2019-04-13 00:00:00.0 Asia/Tokyo (+09:00),
// }
Laravel5.8では”Illuminate\Support\Facades\Date”をuseして、”\Illuminate\Support\DateFactory::use()”の引数に”\Carbon\CarbonImmutable::class”を渡し、”Date::today()”のようにしてインスタンスを生成することで、”Carbon\CarbonImmutable”クラスのインスタンスを取得することができます。
use Illuminate\Support\Facades\Date;
\Illuminate\Support\DateFactory::use(\Carbon\CarbonImmutable::class);
$today = Date::today();
// => Carbon\CarbonImmutable @1554217200 {#4601
// date: 2019-04-03 00:00:00.0 Asia/Tokyo (+09:00),
// }
dump($today);
// => Carbon\CarbonImmutable @1554217200 {#4601
// date: 2019-04-03 00:00:00.0 Asia/Tokyo (+09:00),
// }
$tenDaysLater = $today->addDays(10);
// => Carbon\CarbonImmutable @1555081200 {#4610
// date: 2019-04-13 00:00:00.0 Asia/Tokyo (+09:00),
// }
dump($tenDaysLater);
// => Carbon\CarbonImmutable @1555081200 {#4610
// date: 2019-04-13 00:00:00.0 Asia/Tokyo (+09:00),
// }
dump($today);
// => Carbon\CarbonImmutable @1554217200 {#4601
// date: 2019-04-03 00:00:00.0 Asia/Tokyo (+09:00),
// }
アプリケーション全体でCarbonImmutableを使用する
“/app/Providers/AppServiceProvider.php”の”register()”で”DateFacotry::use”を記述することで、各クラスで”DateFactory::use”を実行する必要がなくなります。
<?php
use Illuminate\Support\DateFactory;
class AppServiceProvider extends ServiceProvider
{
// ...
public function register()
{
DateFactory::use(\Carbon\CarbonImmutable::class);
}
// ...
}
CacheのTTLが秒になった
5.7では”分”で扱われていたTTLが”秒”で扱われるようになりました。
// Laravel 5.7 - Store item for 30 minutes...
Cache::put('foo', 'bar', 30);
// Laravel 5.8 - Store item for 30 seconds...
Cache::put('foo', 'bar', 30);
// Laravel 5.7 / 5.8 - Store item for 30 seconds...
Cache::put('foo', 'bar', now()->addSeconds(30));
上記のPRにも記載されていますが、この変更はPSR-16に対応するためとのことです。

dotenvの#がコメント扱いになった
5.7では”#”は値の一部として認識されていました。
ENV_VALUE=foo#bar
env('ENV_VALUE'); // foo#bar
5.8では”#”がコメントとして扱われるようになりました。
ENV_VALUE=foo#bar
env('ENV_VALUE'); // foo
5.8でも”#”を値として利用したい場合、次に示すように引用符で囲んでやればOKです。
ENV_VALUE="foo#bar"
env('ENV_VALUE'); // foo#bar
テストのsetUpとtearDownに戻り値の型を書くようになった
“laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php”で定義されているsetUpとtearDownに”: void”が追加されました。
TestCaseを継承して、setUp、tearDownを宣言している場合は”: void”を追加する必要があります。
protected function setUp(): void
protected function tearDown(): void
array系、str系のヘルパー関数がdeprecatedになった
“array_first()”や”str_after()”などのarrayとstrのヘルパー関数はLaravel5.9で廃止される予定です。
“Illuminate\Support\Arr”や”Illuminate\Support\Str”を直接使用するように変更が必要です。
array_first() => Arr::first()
str_after() => Str::after()