【Laravel】Laravel5.8で抑えておきたい新機能・変更点

Laravel

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

Laravel - The PHP Framework For Web Artisans
Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing you to create without sweating the small...
スポンサーリンク

Carbon2を新たにサポート!

個人的に最も期待していたのがこの変更です。

Carbon2がサポートされるようになり、Carbonをイミュータブルにすることができるようになりました。

Carbon - A simple PHP API extension for DateTime.
Carbon - A simple PHP API extension for DateTime.

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));
[5.8] Refactor caching TTL to seconds by driesvints · Pull Request #27276 · laravel/framework
These changes will allow developers more finer granular caching. By allowing caching in seconds, developers can set even more specific caching times. // This......

上記のPRにも記載されていますが、この変更はPSR-16に対応するためとのことです。

PSR-16: Common Interface for Caching Libraries - PHP-FIG
We're a group of established PHP projects whose goal is to talk about commonalities between our projects and find ways we can work better together.

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()