Laravel 5.3 -> 10.x へリプレイスしたまとめ

こんにちは。フリーランス・コンサルタント&エンジニアの 九保すこひ です。

さてさて、これはあまり褒められたことではないのですが、どうしても仕事と並行して個人サイトを運営しているとこんなことがあります。

時間がないので、サイトをアップデートできない😭

もちろん、「時間がない」は言い訳ですし、ホントは時間はあるんですが、「心のリソースが残ってない」場合は休息をとることを優先せざるを得なかったりします。(仕事に影響するので…)

すると、ドンドン個人サイトは古いままになってしまってサイトどころかOSもアップデートできなっちゃいますよね。

そして、私が運営しているサイトの中に「無料でプレスリリースを配信できるぷれりり・プレスリリース というサイトがあるのですが、実はLaravel 5.3で構築したものをずっと使っていました。

※ 良かったらぜひ皆さんもご利用ください(なお、修正・削除は有料ですので気をつけてください。すでに10.xへリプレイス済みです)
↓ ↓ ↓

📝 参考ページ: ぷれりり・プレスリリース

※ ちなみに、以前はCakePHP使ってたサイトで、ドメイン登録が2010-09-13なのでなんと13年も運営してます。

そこで❗

今回は重い腰を上げてこのサイトをLaravel5.3から最新版10.xにアップデートすることにしました。

そして、その作業が完了したのでここにその作業内容をまとめてみたいと思います。(つまり、今回コードの紹介はありません。たまには味の違う料理みたいなカンジで楽しんでいただけたら嬉しいです👍)

 「ボディペーパーって
涼しくなると一切使わないので、
来年まで持ち越しますよね??」

開発環境: Laravel 10.x

大変だったこと

では、まずはLaravel 5.3 -> 10.x(約2倍!)で大変だったことをご紹介します。

なお、普通に説明だけだと面白くないので、各ブロックの最後に星5つで「困った度」をつけています。合わせてチェックしてみてください👍

過去のパッケージが対応していない

これは、spatieさんのように超有名なパッケージ開発者ではほとんどありませんが、マイナーなパッケージを使っていると開発が終了してしまっていて、「それ、Laravel 10.x には対応してないよ…😭」とインストールすらできなくなっていたりします。

特に私はその昔パッケージづくりにハマっていたことがあり、個人サイトではふんだんにそのパッケージを使ってきました。

しかし、そうなると「10.x へリプレイスしなきゃいけないのに、パッケージまでアップデートしなきゃいけない…😩」という状況になってしまいます。

結果どうしたかというと、パッケージのアップデートはせず、コードだけを移植して独自ヘルパー関数で呼び出せるようにしたりして対応しました。

なので、少なくともパッケージをインストールする場合はメンテナンスが終わりそうか(難しいですが)予想しておくべきということを学びました。

そう考えると、パッケージを常にアップデートしている開発者さんには感謝ですね m(_ _)m

困った度: ★★★★★

Laravel で使えなくなったコードへの対応

これも「パッケージが対応していない」に似てるかもしれませんが、Laravel自体たくさんの追加機能があれば、削除される機能もあったりします。

その代表例が、「ヘルパー関数」です。

例えば、その昔ヘルパー関数はstr_contains()だったりstr_limit()という書き方でしたが、現在はStr::contains()Str::limit()と書くようになっていて、10.xではすでに後方互換もなくなっているので、その全てでエラーが発生することになりました。

なので、しょうがないのでひとつずつコードを検索して置き換える作業をしました。(全置換だと時短になるんですが、ネームスペースが入るとコードが読みにくくなるので、なんかイヤなんです😂)

困った度: ★★★☆☆

moment.js が開発終了してた

これも時間の経過が影響しているものですが、JavaScriptで日時を管理するための有名パッケージ「moment.js」は開発が終了してしまっていて、本家サイトにも「新しいプロジェクトでは使わないほうがいいよ」と書いています。

📝 参考ページ: Project Status

正直今回のリプレイス案件ではそこまで日時を使っているわけではないですが、結論としては正式な後継者とされるLuxonに変更することにしました。

すると、メソッドなどコードの書き方はすべて変更になります。

となると、やはり少し時間がかかってしまいました。

※ 心の声moment.js使いやすかったのにな…なんでLuxonにも同じカンジで使えるようにしなかったんでしょうか…🤔

困った度: ★★★★☆

bower -> vite への対応がめんどうだった

冒頭でも書いたとおり、今回はLaravel 5.3 -> 10.xへのリプレイスですが、そもそもはCakePHPで開発をはじめたサイトだったのでwebpackgulpどころgruntでもなく、bowerを使ってJavaScriptのパッケージを管理していました。(bower、シンプルで良かったですけどね👍)

しかし、現在パッケージの管理はViteが主流なのでやはりこれを利用することにしたのですが、先程と同じくパッケージが古いものがあるのでビルドする際のコードの書き方なんて書いていない訳です。

なので、少しとまどった部分がありました。

なお、詳しくは見ていないのですが当初はmoment.jsを使う方向で考えていたのですが、どうやってもビルドする形に対応できなかったのでLuxonを選択したという経緯もありました。

困った度: ★★★☆☆

function -> アロー関数への変更がめんどうだった

これはちょっとしたこだわりみたいなことなのでしょうが、最近はJavaScript内で「function」と書くことがなくなったため、昔のコードが気になってしかたなくなってしまい(笑)全てアロー関数に変更しました。

しかし、そうすると頭もスッキリするのでコードが読みやすくなるのですが、どうしてもケアレスミスがでたりもするので、ChatGPTとかを使ったほうが良かったかな??と今では思います。(個人サイトではバンバン使ってます😊)

困った度: ★☆☆☆☆

Vue 2 -> Vue 3への変更がめんどうだった

リプレイスしているサイトはVue 2を使って開発していたので、これをVue 3に変更することにしました。

もちろんOptions API形式でコードを書いているので、コレを機にComposition APIに書き換えるようかとも思ったのですが、そんな時間もないのでそのまま、createApp()を使うことにしました。

なので、それほど大変というわけではないですが、以下のような変更が必要でした。

  • ID の指定を mount(‘#app’) に変更
  • data: はオブジェクトではなく、data() {  } にする
  • self -> this へ変更 ※

function からアロー関数へ変更したことによってthisが使えるようになったので、コードスッキリのために変更しました。

困った度: ★★☆☆☆

独自バリデーション(AppServiceProvider -> Rule がめんどう)

その昔、Laravelで独自バリデーションを使えるようにするためにはAppServiceProviderなどにセットしていましたが(今でもいける??🤔)、現在はRuleとしてクラス化することができるようになりました。

バリデーション部分は重要なところなので、今回はAppServiceProviderにあるものを全てRule化することにしました。

なお、Rule自体もtrue/falseで返り値をつくるのではなく、$fail()に変更になっていてちょっととまどいました。

困った度: ★☆☆☆☆(実際は0.5ぐらいかな)

データを Enum 化した

これも必要性は低かったのですが、Enumは好きな機能なのでモデルで管理していたデータをEnum化することにしました。

コードは全て変更にする必要がありましたが、よりコードがすっきりしたのでやって良かったですね👍

困った度: ★☆☆☆☆

引数が変更になっているものがあった

例えば、Cache::remember()はその昔は分(minutes)で指定することになっていましたが、現在は秒(seconds)です。なので、そのままコードを使ってしまうと、キャッシュ時間が短くなってしまうんですね。

これ、一応全部コードを確認しましたが、どこかにminutesが残ってるんじゃないかと若干心配しています。

困った度: ★★★☆☆

CakePHPの残り香がきつかった

これは、直接Laravel 5.3 -> 10.xのリプレイスには関係ないですが、冒頭でも書いたとおり、もともとCakePHPを使って開発を始めたので、DBのテーブル構造が違っており、大変でした。

具体的にはcreated_at, updated_atがなくregisteredというカラムを使って登録管理するようになってたのですが、SQLをダンプしてもインポートできないというなんとも「・・・」な状況です。

結果どう対応したかというと、独自Artisanコマンドを作って別DBから取得&データ加工して新しいDBへ保存するという「しらみつぶし作戦」をとりました。(これをしなきゃいけないのが2テーブルだけで良かったです…😅)

困った度: ★★★★★

楽だったこと

そして、ここからは逆に「楽だったこと」もまとめてみることにしました。
なお、こっちはサンキュー指数です。

ほぼビューはそのまま使えた

ビューはほとんどそのまま使えました。
ただし、もしInertiaとか使うとなると大きく作業が増えると思うので、今回はベーシックなLaravelでリプレイスすることにしました。

なお、Inertiaも今後ずっと使われるかは疑問もあるので技術選定って難しいですね…。

サンキュー指数: ★★★★★

コントローラーやモデルもほぼ同じで使えた

モデルもリレーションシップの書き方がModel::classみたいな書き方になっているだけでAccessorMutatorはほぼ普通に使えましたし、コントローラーも書き方が変わっている部分はありませんでした。

※ ただし、ネームスペースが変更になっていると問題なので、必ずartisanコマンド使ってファイルを作成したあと、クラスの中身だけを移植した感じです。

サンキュー指数: ★★★★☆

ということで、今回はこんなカンジです。

企業様へのご提案

今回のような「アップデートしていないサイト」は世の中に結構あると感じています。特に「うまく動いているサイトをリプレイスするのはどうだろう」という意見も多くあるかと思いますので、実行に移すのは難しい部分があるかもしれません。

しかし、今後新しい技術はどんどん使いにくくなっていく(=作業効率が落ちる)ことが考えられますし、何よりセキュリティの危険度が上がっていくことは間違いありません。

もしそういったリプレイス作業をご検討でしたら、いつでもお気軽にお問い合わせください。

お待ちしております。😊✨

開発のご依頼お待ちしております
開発のご依頼はこちらから: お問い合わせ
どうぞよろしくお願いいたします! by 九保すこひ

おわりに

ということで、今回はいつもと違って全くコードを紹介しない回になりました。たまにはこういうのも新鮮でいいですね。

しかし、2010年に開発を始めた頃は独自のフレームワーク(👈史上最低のフレームワークでした😂)を使っていて、本屋で立ち読みした結果CakePHPにし、今はLaravelにたどり着いたというちょっとした歴史あるサイトなので、今後も時代の流れに合わせて運営していけたら嬉しいです。

なお、そう考えると個人サイトを運営していなかったらここまでプログラムのことを好きにはなっていなかったと思うので、「やってよかった」がシンプルな感想です。

ただ、消えていったその他のサイトはその何倍もあるので、そういったサイトの供養にもなればいいですね。

ぜひ皆さんも個人サイト開発で楽しんでみてください。

ではでは〜❗

「気温35度オーバーばかり
だったので、32度でも
超快適ですね(笑)」

このエントリーをはてなブックマークに追加       follow us in feedly