# Laravel 5.1 から 8.1 にバージョンアップ

仕事の関係で laravel のアップグレード作業をしましたが、簡単にできると思ったけど意外とハマったことを記録します。
laravel5.7 か 8 から使い始めたので 5.1 ってそんなに変わらないだろうと単純に思ったことが一番のミス。特に認証周りですが、laravel のデフォルト auth 機能使っていたらそんなに問題ないかもしれませんが、カスタマイズドライバーの自己流認証に出会って、いろいろ大変でした。当たり前ですが、5.1 触ったことない人間はまず 5.1 と 5.2 のドキュメントを読んで変更該当箇所のロジックを理解して修正した方がスムーズに行くはずです。

# 5.1 から 5.2

5.1 から 5.2 へのアップグレード (opens new window)

# 認証

  • config/app.php
  • config/auth.php
  • app/Providers/AuthServiceProvider.php

# 設定ファイル

  • config/auth.php
<?php

return [

    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    ],
    'providers' => [
        'users' => [
            'driver' => 'webEloquent',
            'model' => App\Models\User::class,
        ],
    ],
];

# カスタイムドライバ

ユーザを取得するカスタムメソッドを定義する Auth::extend メソッドを使っている場合、カスタムユーザプロバイダを定義するための Auth::provider を使ってください。カスタムプロバイダを定義したら、新しい auth.php 設定ファイルの providers 配列の中でそれを設定してください。

カスタム認証プロバイダについての詳細は、認証の完全なドキュメント (opens new window)で調べてください。

app/Providers/AuthServiceProvider.php

    public function boot(GateContract $gate)
    {
        parent::registerPolicies($gate);

        $this->app['request']->server->set('HTTPS', env('APP_ENV') == 'production');
        $this->app['auth']->provider('webEloquent', function ($app) {
            return
                new webEloquentUserProvider(
                    new \Illuminate\Hashing\Hasher,
                    \Config::get('auth.providers.users.model')
                );
        });
    }

# サービスプロバイダ

app.php 設定ファイルのサービスプロバイダリストから

  • Illuminate\Foundation\Providers\ArtisanServiceProvider
  • Illuminate\Routing\ControllerServiceProvider

を削除

# 5.2 から 5.3

5.2 から 5.3.0 へのアップグレード (opens new window)

# Providers

App\Providers\EventServiceProvider.php 修正

    public function boot()
    {
        parent::boot();
    }

In RouteServiceProvider.php line 25:

Declaration of App\Providers\RouteServiceProvider::boot(Illuminate\Routing\Router $router) should be compatible with Illuminate
\Foundation\Support\Providers\RouteServiceProvider::boot()

App\Providers\RouteServiceProvider.php 修正

    public function boot()
    {
        parent::boot();
    }

In ValidatorServiceProvider.php line 19:

Declaration of App\Providers\ValidatorServiceProvider::boot(Illuminate\Routing\Router $router) should be compatible with Illuminate\Foundation\Support\Providers\RouteServiceProvider::boot()

App\Providers\ValidatorServiceProvider.php 修正

    public function boot()
    {
        // $attributes設定すると、各自のRequest Classのattributesの設定を、
        // 設定しないと、resource/lang/ja(app.localeの設定)/validation.phpのattributesの設定を見に行く。
        Validator::resolver(function($translator, $data, $rules, $messages, $attributes) {
            return new CustomValidator($translator, $data, $rules, $messages, $attributes);
        });

    }

# 配列

配列ヘルパーキーと値順序変更 💩

first last whereメソッドに渡すクロージャの、最初の引数として「値」が渡されます。

Arr::first($array, function ($value, $key) {
    return ! is_null($value);
});

# コレクション

コレクションメソッドキーと値順序変更 :hankey

first last containsコレクションメソッドでは、指定されたコールバッククロージャの 第1引数に「値」 が渡されます。

$collection->first(function ($value, $key) {
    return ! is_null($value);
});

# 設定

config/app.php設定ファイルの中に、以下の設定オプションを追加してください。

'name' => 'アプリケーション名',

# コントローラー

コンストラクターの中からセッションアクセス

Laravel5.3 では、セッションや認証済みユーザにコントローラのコンストラクタではアクセスできません。なぜなら、ミドルウェアがまだ実行されていないからです。

代わりに、クロージャベースのミドルウェアをコントローラのコンストラクタで直接で意義できます。この機能を使用する前に、アプリケーションが Laravel5.3.4 以上で実行されていることを確認してください。
代わりに、クロージャベースのミドルウェアをコントローラのコンストラクタで直接で意義できます。

    public function __construct()
    {
        $this->middleware(function ($request, $next) {
            $this->projects = Auth::user()->projects;

            return $next($request);
        });
    }

$value = $request->session()->get('key');は OK

# DB コレクション

Fluent なクエリビルダ (opens new window)が普通の配列の代わりに、Illuminate\Support\Collection インスタンスを返すようになりました。

  • AppServiceProvider の boot メソッドで、以下のように morphMap を定義する必要があります。
use Illuminate\Database\Eloquent\Relations\Relation;

Relation::morphMap([
    'user' => User::class,
]);

# 結論

php や laravel だけのアップグレードは難しいものではないが、5.1 から 5.2 へアップグレードする時のカスタマイズ認証のところが一番大変でした。グーグル先生に聞いても答えがなく、5.1 のドキュメントを繰り返して読んで、カスタマイズ認証のやり方を先ず学習してからなんとか 5.2 にアップグレードできました。そもそもこれってメジャーの変更ではないか?でも思いました。それ以降のアップグレードは sessionn あたりや array 配列ヘルパーなどの変更がありました。あと、注意点としてphp artian cache:clear php artisan config:clear php aritsan view:clear 系のキャッシュをクリアはまめにした方が無難ですね。
複数 git ブランチ切り替えて作業する場合はcomposer updateする前に vendor ディレクトリ削除と composer.lock 削除した作業効率的になります。
session が見つからないエラーは何回か出ましたが、結局php artisan key:generateで解消できました。

2020-10-12
  • laravel
レンタルサーバー エックスサーバー レンタルサーバー エックスサーバー DMM fx DMM fx 開発/運用エンジニア募集プログラム 開発/運用エンジニア募集プログラム 外為ジャパンFX 新規口座開設促進 外為ジャパンFX 新規口座開設促進 eBay公式ショッピングサイト Qoo10 eBay公式ショッピングサイト Qoo10 Amazon.co.jpのカテゴリごとのページ