九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さてさて、これはあまり褒められたことではないのですが、どうしても仕事と並行して個人サイトを運営しているとこんなことがあります。
時間がないので、サイトをアップデートできない😭
もちろん、「時間がない」は言い訳ですし、ホントは時間はあるんですが、「心のリソースが残ってない」場合は休息をとることを優先せざるを得なかったりします。(仕事に影響するので…)
すると、ドンドン個人サイトは古いままになってしまってサイトどころかOS
もアップデートできなっちゃいますよね。
そして、私が運営しているサイトの中に「無料でプレスリリースを配信できる」ぷれりり・プレスリリース というサイトがあるのですが、実はLaravel 5.3
で構築したものをずっと使っていました。
※ 良かったらぜひ皆さんもご利用ください(なお、修正・削除は有料ですので気をつけてください。すでに10.x
へリプレイス済みです)
↓ ↓ ↓
📝 参考ページ: ぷれりり・プレスリリース
※ ちなみに、以前はCakePHP
使ってたサイトで、ドメイン登録が2010-09-13
なのでなんと13年
も運営してます。
そこで❗
今回は重い腰を上げてこのサイトをLaravel
の5.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
で開発をはじめたサイトだったのでwebpack
やgulp
どころ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
みたいな書き方になっているだけでAccessor
やMutator
はほぼ普通に使えましたし、コントローラーも書き方が変わっている部分はありませんでした。
※ ただし、ネームスペースが変更になっていると問題なので、必ずartisan
コマンド使ってファイルを作成したあと、クラスの中身だけを移植した感じです。
サンキュー指数: ★★★★☆
ということで、今回はこんなカンジです。
企業様へのご提案
今回のような「アップデートしていないサイト」は世の中に結構あると感じています。特に「うまく動いているサイトをリプレイスするのはどうだろう」という意見も多くあるかと思いますので、実行に移すのは難しい部分があるかもしれません。
しかし、今後新しい技術はどんどん使いにくくなっていく(=作業効率が落ちる)ことが考えられますし、何よりセキュリティの危険度が上がっていくことは間違いありません。
もしそういったリプレイス作業をご検討でしたら、いつでもお気軽にお問い合わせください。
お待ちしております。😊✨
おわりに
ということで、今回はいつもと違って全くコードを紹介しない回になりました。たまにはこういうのも新鮮でいいですね。
しかし、2010年に開発を始めた頃は独自のフレームワーク(👈史上最低のフレームワークでした😂)を使っていて、本屋で立ち読みした結果CakePHP
にし、今はLaravel
にたどり着いたというちょっとした歴史あるサイトなので、今後も時代の流れに合わせて運営していけたら嬉しいです。
なお、そう考えると個人サイトを運営していなかったらここまでプログラムのことを好きにはなっていなかったと思うので、「やってよかった」がシンプルな感想です。
ただ、消えていったその他のサイトはその何倍もあるので、そういったサイトの供養にもなればいいですね。
ぜひ皆さんも個人サイト開発で楽しんでみてください。
ではでは〜❗
「気温35度オーバーばかり
だったので、32度でも
超快適ですね(笑)」