Laravel 5.7の更新を終えて、次は最新の5.8への更新です。こちらも私が経験したことをもとに、いくつかの重要な更新箇所をここで説明です。

ヘルパーの変更

以下は5.6の時点でのLaravelで使用できるヘルパーの一部です。

そして、以下が5.8(現時点の5.7でも)時点でのヘルパーです。

配列や文字列処理の関数が変わりましたね。

Psy Shell v0.9.9 (PHP 7.2.16 — cli) by Justin Hileman
>>> $pen = ['color' => 'red'];
=> [
     "color" => "red",
   ]
>>> array_get($pen, 'color');
=> "red"
>>> Arr::get($pen, 'color');
=> "red"

と今までのグローバルの関数ではなくネームスペース(Arr, Str)を使用しての関数に変わります。賛否両論があるようですが、幸いにも、5.8では両方の形態を対応しています。しかし、5.9からはArrやStrの関数に対応するグローバル関数は廃止となる予定です。

私は、Laravel Shiftのサービスをバージョン更新の最初のステップとして使用しているので、必要なクラスの宣言やヘルパーの変換はすべて、その更新サービス(有料)が行ってくれました。

変換した後に、1つ問題となったのは、エラーチェックに使用しているphanの出力です。phanはコード解析をして、プログラムにおいての疑わしい問題個所をリストしてくれます。変更後のコードでは、以下のような関数未定義のエラーがたくさん出ました。

...
-app/Helpers/Lob.php:517 PhanUndeclaredStaticMethod Static call to undeclared method \Illuminate\Support\Arr::first
-app/Helpers/Lob.php:691 PhanUndeclaredStaticMethod Static call to undeclared method \Illuminate\Support\Arr::get
-app/Helpers/Lob.php:728 PhanUndeclaredStaticMethod Static call to undeclared method \Illuminate\Support\Arr::get
...

これは、phanをLaravelのプロジェクトで使用できるために使っている_ide helper.phpの問題のようです。

...
namespace Illuminate\Support {                                                                                                                                                                                     
                                                                                                                                                                                                                   
    /**                                                                                                                                                                                                            
     *                                                                                                                                                                                                             
     *                                                                                                                                                                                                             
     */                                                                                                                                                                                                            
    class Arr {                                                                                                                                                                                                    
                                                                                                                                                                                                                   
    }                                                                                                                                                                                                              
                                                                                                                                                                                                                   
    /**                                                                                                                                                                                                            
     *                                                                                                                                                                                                             
     *                                                                                                                                                                                                             
     */                                                                                                                                                                                                            
    class Str {                                                                                                                                                                                                    
                                                                                                                                                                                                                   
    }                                                                                                                                                                                                              
                                                                                                                                                                                                                   
}  
... 

の部分を削除すれば、上のようなエラーを余計な吐き出すことはないです(参照)。

Cacheの時間単位の変更

こちらの変更は、Cache関連の関数を使用している開発者には大ごとです。キャッシュの保持時間の単位が今までの分単位から、より細かい時間を指定するために秒単位に変わります。

// Laravel 5.7 - 30分データを保持から、
Cache::put('foo', 'bar', 30);

// Laravel 5.8 - 30秒データ保持に変わる
Cache::put('foo', 'bar', 30);

// 30分をキープしたいなら、
Cache::put('foo', 'bar', 30 * 60);

By khino