Laravel7 リリース

2020/03/19

2020/03/03 に Laravel7 がリリースされたので、ちょっとだけ見てみました。

(2020/3/19 現在、バージョンは 7.1.3)

https://laravel.com/docs/7.x/upgrade

Symphony 5 リリース

  • Laravel7 では Symphony5 以上
  • PHP 7.2.5 以上
  • laravel/framework ^7.0
  • nunomaduro/collision ^4.1
  • phpunit/phpunit ^8.5
  • facade/ignition ^2.0
  • laravel/tinker ^2.0
  • facade/ignition  ^2.0
  • report()、render() は、Exception から Throwable に変更

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

7.x にアップデート

composer.json 設定

composer.json に必要なライブラリのバージョンを書き換えます。


    "require": {
        "php": "^7.2.5",
        "fideloper/proxy": "^4.2",
        "fruitcake/laravel-cors": "^1.0",
        "guzzlehttp/guzzle": "^6.3",
        "laravel/framework": "^7.3",
        "laravel/tinker": "^2.0"
    },
    "require-dev": {
        "facade/ignition": "^2.0",
        "fzaninotto/faker": "^1.9.1",
        "laravel/ui": "^2.0",
        "mockery/mockery": "^1.3.1",
        "nunomaduro/collision": "^4.1",
        "phpunit/phpunit": "^8.5"
    },

composer update


$ composer update

Authentication

「Authentication Scaffolding」が変更となったようです。

Scaffolding

  • 認証の自動作成の改修
  • Illuminate\Auth\Passwords\TokenRepositoryInterface
  • recentlyCreatedToken メソッドが追加

Eloquent

Date Serialize

  • Eloquent Model で Carbon の日付フォーマット改修
  • ISO-8601 による、timezone と 秒の小数部の対応
  • 現状の仕様をキープしたい場合は、serializeDate をオーバーライド

DB と Eloquent のフォーマットがことなると、Exception になるのでこれが改修されたか?検証が必要

Unique Route Names

  • 同じ Route名を指定できなくなった
  • 重複する場合は、重大なエラーが発生する

CORS サポート

  • Cross-Origin Resource Sharing (CORS) でクロスドメイン通信
  • 「\Fruitcake\Cors\HandleCors::class」を グローバルの Middleware に追加

$ composer require fruitcake/laravel-cors

CastsAttributes

「CastsAttributes」を implements することで、カスタムでキャストすることができます。

カスタムクラスに、get、set メソッドを追加し、Eloquent モデルに $casts を設定することで、自動的にキャストされるようです。

下記の例は、json_decode()、json_encode() を利用して JSON型のキャストを行なっています。


namespace App\Casts;

use Illuminate\Contracts\Database\Eloquent\CastsAttributes;

class Json implements CastsAttributes
{
    public function get($model, $key, $value, $attributes)
    {
        return json_decode($value, true);
    }

    public function set($model, $key, $value, $attributes)
    {
        return json_encode($value);
    }
}

namespace App;

use App\Casts\Json;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $casts = [
        'options' => Json::class,
    ];
}

Blade

The component Method

  • 「Blade::component」 から 「Blade::aliasComponen」に名称変更

Blade Component Tags

Viewコンポーネントクラスにプロパティやメソッドを設定することで、Blade の記述をシンプルにできます。

下記の例は、Alert コンポーネントクラスを作成し「alert.blade.php」に対して、class を動的に設定します。


namespace App\View\Components;

use Illuminate\View\Component;

class Alert extends Component
{
    public $type;

    public function __construct($type)
    {
        $this->type = $type;
    }

    public function classForType()
    {
        return $this->type == 'danger' ? 'alert-danger' : 'alert-warning';
    }

    public function render()
    {
        return view('components.alert');
    }
}

Factory Types

  • Laravel7 から factory types が削除された

プロジェクト作成

実際に、認証処理を実装していきます。

※Laravel7 の認証ページ

https://readouble.com/laravel/7.x/ja/authentication.html


$ composer create-project laravel/laravel laravel-auth --prefer-dist
$ chmod -R 777 storage
$ chmod -R bootstrap/cache

バージョン確認


$ php artisan --version
Laravel Framework 7.1.3

この時点で、 config/auth.php などが作成されています。

  • config/auth.php
  • app/User.php
  • app/Http/Middleware/Authenticate.php
  • database/migrations/xxxx_create_users_table.php
  • database/migrations/xxxx_create_password_resets_table.php
  • database/factories/UserFactory.php

app/User.php


namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;
    protected $fillable = [
        'name', 'email', 'password',
    ];
    protected $hidden = [
        'password', 'remember_token',
    ];
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

最近のバージョンアップが早く、仕様も日々変わりつつあるのでチェックが必要ですね。