Laravel 7 Release Memo

# Laravel 7 Release

- [Laravel 7 Release Note](https://laravel.com/docs/7.x/releases)
- [Laravel 7 Upgrade Guide](https://laravel.com/docs/7.x/upgrade)

Laravel7 です。素数です。おめでとうございます。

前回の Laravel6 から半年ぶりのメジャーリリースです。semvar になったので、数字のステップは大きいですが、変更内容は意外と無い（と信じたいです）。

LTS Version ではないので、Bugfix は 2020/09/03、SecurityFix は 2021/03/03 までの予定だそうです。

Upgrade Guide には馴染みになった **High Impact Changes**, **Medium Impact Changes** があります。

### 2020/04/28: 追記：

リリース情報は [Releases The Laravel Blog](https://blog.laravel.com/releases) から追っかけられます。

## 新機能

### Model Cast

Cast 機能の自由化： `CastsAttributes` を使ったクラスを使えば、Model の要素を任意の型にキャストすることができるようになります。

[Custom Cast](https://laravel.com/docs/7.x/eloquent-mutators#custom-casts)

### MailDriver

何か `\Mail::mailer('hoge')->send()` みたいなのができるようになるそうです。 ~数年前にほしかったなぁ…自前実装したよ…~

```
Mail::mailer('postmark')
        ->to($request->user())
        ->send(new OrderShipped($order));
```

### HTTP Client

HTTP Client の Facade ができて、Guzzleの長いコードを書かずに、サクッとHTTP Client が使えるようになるっぽいです。 ~[Requests](https://github.com/rmccue/Requests) やいかんのか~

### Route Model Binding

`id` 指定だけだったのが、任意のフィールド指定ができるようになりました。

```
Route::get('api/posts/{post:slug}', function (App\Post $post) {
    return $post;
});
```

### Artisan Test

今まで `./vendor/bin/phpunit` とやっていたのが `php artisan test` でも動くようになりました。

### Queue `maxExceptions` Configuration

じゃんじゃか例外を出している時の上限数を決めて、止めることができるようです？ ~redis が死んだ時に出まくった事あるけど、アレも止まるんやろか~

## 大きな変更点

### 依存関係

Symfony5系を使うようになりました。 `composer.json` を編集して `composer up` をする必要があります。
	
- `'laravel/framework': '^7.0'`
- `'nunomaduro/collision': '^4.1'`
- `'phpunit/phpunit': '^8.5'`
- `'facade/ignition': '^2.0'`

### [High] Symfony5

1. `App\Exceptions\Handler` クラスの `report`,`render` メソッドの引数が、`Exception` から `Throwable` に変わります。

```
use Throwable;

public function report(Throwable $exception);
public function render($request, Throwable $exception);
```

### [High] session.php

1. `session.php` 設定ファイルに存在する要素 `secure`, `same_site` の値が微妙に変更されました。

- 旧: `'secure' => env('SESSION_SECURE_COOKIE', false),`
- 新: `'secure' => env('SESSION_SECURE_COOKIE', null),`
- 旧: `'same_site' => null,`
- 新: `'same_site' => 'lax',`

### [High] Scaffolding

認証周りの Scaffolding は `laravel/ui` へ移動しました。もし使っている場合は、 `composer require laravel/ui "^2.0"` でインストールをしてください。

### [Low] recentlyCreatedToken method add to `Illuminate\Auth\Passwords\TokenRepositoryInterface`

`Illuminate\Auth\Passwords\TokenRepositoryInterface` に `recentlyCreatedToken` メソッドが追加されました。カスタマイズして使っている時は注意してね。

### Blade

力尽きたンゴ

### [Medium] `addHidden`,`addVisible`

ドキュメント化されていない `addHidden`,`addVisible` メソッドは削除されました。代わりに `makeHidden`,`makeVisible` を使ってください。

### [Low] The booting / booted Methods

わからん。なんだこれ。

#### [High] Date Serialization

Larvel 7 から`toArray`,`toJson` を使ったときの、日付のシリアライズが変わります。今までは `Carbon` の `toJson` の結果を書き出していましたが、ISO-8601 にタイムゾーンと、fractional seconds（秒の小数点以下）を含んだフォーマットで書き出すようになります。この影響により、クライアントサイド側のパーサー周りを修正する必要があります。
具体的には `2019-12-02 20:01:00` と表記されていた日付は `2019-12-02T20:01:00.283041Z` になります。

もしこの変更に不都合がある場合は `serializeDate` メソッドをオーバーライドで実装して任意のフォーマットで書き出すようにしてください。

```
/**
 * Prepare a date for array / JSON serialization.
 *
 * @param  \DateTimeInterface  $date
 * @return string
 */
protected function serializeDate(DateTimeInterface $date)
{
    return $date->format('Y-m-d H:i:s');
}
```


### [Medium] Factory Types

非ドキュメントの部分の factory types が消える予定？


### [Low] The getOriginal Method

cast 機能が入ったので `$model->getOriginal()` が変更されます。使う場合は `getRawOriginal` を使ったら良いみたい。

### [Low] Route Binding

力尽きたンゴ

### [Low] PSR-7 Compatibility

力尽きたンゴ

### [未知数] Mail :: Configuration File Changes

Multiple Mail 対応に伴い、 `mail.php` の設定ファイルが変更されました。人によってはごっそり変わるかもしれませんので、[元ファイル](https://github.com/laravel/laravel/blob/develop/config/mail.php) を参考に手動migrateをしたほうが良いです。


### [Low] Markdown Mail Template Updates

デザイン変わったやで

### [Low] Queue Deprecated --daemon Flag Removed

`queue:work` コマンドにある `--daemon` オプションは削除されます。そして daemon 起動が標準となります。

### [Low] Resources The `Illuminate\Http\Resources\Json\Resource` Class

`Illuminate\Http\Resources\Json\Resource` クラスは廃止されました。代わりに `Illuminate\Http\Resources\Json\JsonResource` を継承して使用してください。

### [Medium] Unique Route Names

Routing に付ける名前で重複した場合、以前までは重複チェックせずに起動していました。Laravel 7 からはユニークになるように設定してください。重複した場合、意図しない動きになるそうです。 ~開発中にぼへーっと重複させて動かしちゃうけど、後者優先で動いていたけど、その挙動がバラバラになるのかしら~

### [Medium] Cors Support

Cross-Origin Resource Sharing 用の設定ファイルが、 `config/cors.php` として増えました。[元ファイル](https://github.com/laravel/laravel/blob/develop/config/cors.php)を参考に頑張ってください。

### [Medium] The assertSee Assertion

力尽きた

### [Medium] The different Rule

`different` Rule はリクエストに含まれる指定されたパラメータの一つが無い時は失敗するようになりました。