Craft 4へのアップグレードメモ

公開

Craft 4のリリースを受け、当サイトのCraftもバージョン4にアップグレードしました。以前「Preparing for Craft 4」に従って準備を進めていましたが、「Upgrading from Craft 3」に従ってアップグレード作業を進めると500エラーが出て何も表示されなくなるなどいくつかつまづく点があったのでメモしておきます。(なお、このブログを運用する程度の知識しか持っておりません。)

真っ白い画面に「An internal server error occurred.」が表示される

config/general.phpを開き「Preparing for Craft 4」で言及されているsiteUrlの削除漏れの対応を行いました。またcacheMethodも一旦削除しました。これらはnginxのエラーログに詳細が記録されていました。(例:'Invalid general config setting: cacheMethod. You can set custom config settings from config/custom.php.')

自作プラグインが正しくロードされずエラーになる

Craftのstorage/logs/web-2022-05-05.logに'Class "Twig_Extension" not found'が記録されていました。「HeadingLevelSlider」という自作のTwigフィルタの問題でした。最近メンテナスが止まっているようですがpluginfactory.ioでひな形を出力してみたところ、インポートするクラスや呼び出す関数名が変わっていました。書き換えることで問題は解消しましたが、詳しい情報は「How to Write a custom Twig Extension (Symfony Docs)」を参照すると良さそうです。

サイトは表示されるが管理画面を開くと真っ白い画面に「An internal server error occurred.」が表示される

nginxのエラーログを見ると'Cannot assign null to property craft\services\Deprecator::$throwExceptions of type bool'が記録されていました。よく分からずGoogleで検索してみると、config/app.phpを編集すれば良いとのコメントを見つけdeprecatorの設定を編集したところ解決しました。

そもそもこのdeprecatorの記述は何だろうと思ったのですが、本記事を書きながら振り返ると「Preparing for Craft 4」の中の「Fix deprecation warnings.」で紹介されている記述でした。.envが読めていない等があるかもしれませんが、そもそも本番環境なので消しておきました。

管理画面のカスタマイズが効かない

Craft CMSの「テンプレートフック」で管理画面に任意のコンテンツを表示する」で紹介している内容が表示されなくなりました。調べてみるとCraft 4ではテンプレートフックは廃止されていました。ガイドに沿ってElementsController::EVENT_DEFINE_EDITOR_CONTENTを利用するコードにしたところ無事表示されるようになりました。Event Code Generatorを利用すると楽です。

Event::on(
    ElementsController::class,
    ElementsController::EVENT_DEFINE_EDITOR_CONTENT,
    function (DefineElementEditorHtmlEvent $event) {
        $event->html .= '<div style="margin-top: 1.5rem;">SiteGuard設定: <pre>./tools/setip ' . $_SERVER['REMOTE_ADDR'] . '</pre></div>';
    }
);