#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);
        });

    }

#配列

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

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

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

#コレクション

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

firstlastcontainsコレクションメソッドでは、指定されたコールバッククロージャの第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:clearphp artisan config:clearphp aritsan view:clear系のキャッシュをクリアはまめにした方が無難ですね。
複数gitブランチ切り替えて作業する場合はcomposer updateする前にvendorディレクトリ削除とcomposer.lock削除した作業効率的になります。
sessionが見つからないエラーは何回か出ましたが、結局php artisan key:generateで解消できました。

2020-10-12
  • php

関連記事

twig 3 人気 PHP テンプレートエンジンがバージョンアップ
php curl 使って クリックなしで POST 送信
allowurlinclude の設定で ftp_connect()エラー
Lumen と Laravel 違い比較
Laravel5.7 の MVC 使う時のメモ
php 開発におけるルール・規約
PHP 7.4 にアップグレードして使えなくなる機能
解決!phpMyAdmin テーブル構造の内容が表示されない問題
正規表現一覧 よく使う検索・置換のパターン
開発時によく使うゼロ埋めパディング作業まとめ
知ってるようで知らなかった composer のコマンドとオプションの世界
laravel vuejs 初期設定
HTML から PDF に変換 PHP ライブラリ mPDF の設定
nuxtjs と codeigniter で jwt システム構築
爆速・軽量フレームワーク codeigniter PHP 開発
Laravel Error についてのメモ