Hoe update je Magento 2.4.3

25 oktober 2021 17:14
Laatste update: 6 december 2022 10:17
Door Rick Daalhuizen

Magento 2.4.3 komt met veel nieuwe features, bug fixes, snelheid optimalisaties en andere verbeteringen. Met dit artikel wil ik doornemen hoe we Magento kunnen updaten naar 2.4.3 en deel ik onze ervaring, waarbij we een Magento 2 shop van 2.3.5 naar 2.4.3 hebben ge-update.

Hierbij deel ik alle issues die wij zijn tegengekomen én hoe we ze hebben opgelost!

Nieuwe features and fixes in Magento 2.4.3

Magento 2.4.3 komt met een reeks aan nieuwe features, maar ook verbeteringen in security en snelheid optimalisatie. Ik ga ze niet allemaal opnoemen gezien deze ook te vinden zijn in de Magento 2.4.3 Release Notes. Echter zal ik er een paar benoemen, waarvan ik vind dat ze belangrijk zijn:

  • Er is een nieuwe composer-plug-in toegevoegd die integriteitscontroles uitvoert tijdens de installatie om “dependency confusion” te verminderen.
  • PayPal Pay Later wordt nu ondersteund, waarbij het mogelijk is om een bestelling in tweewekelijkse termijnen te betalen, in plaats van het volledige bedrag op het moment van aankoop.
  • Dependencies van Core Composer en third-party libraries zijn geüpgraded naar de nieuwste versies die compatibel zijn met PHP 8.x.
  • KnockoutJS is geüpgraded naar v3.5.1.
  • TinyMCE v3 is verwijderd
  • Magento 2.4.3 ondersteund Redis 6.0.12
  • Admins kunnen nu een website uitsluiten van een klantengroep of catalogus, waardoor de indexering wordt verminderd en de indexeringstijden zijn verbeterd.
  • Page Builder vervangt de TinyMCE-editor op de volgende plekken: CMS Page, CMS Block, Categorie Beschrijving en Product Beschrijving.

En zo is er nog veel meer, maar hiervoor raad ik je aan om de Magento 2.4.3 Release Notes verder door te nemen.

Voorbereiding

Voordat we de upgrade uitvoeren, zijn de volgende voorbereidingen nodig. Deze staan ook grotendeels beschreven in de Magento 2 Install Guide – Upgrade Commerce. Hou er ook rekening mee dat de “systeem requirements” anders kunnen zijn, zeker wanneer jouw huidige Magento installatie nog op 2.3.x draait.

Magento 2.4.3 vraagt o.a. om het volgende:

  • Composer v2.X
  • Elasticsearch v7.9
  • MaridaDB 10.4 en voor Mysql 8.0
  • PHP 7.4
  • Apache 2.4 en voor Nginx 1.8
  • Varnish 6.5
  • Redis 6.0
  • RabbitMQ 3.8

Belangrijk is dat de omgevingen dit ondersteunen. Voor onze lokale omgevingen (we werken met Docker icm Docksal), is dit aangepast voordat we aan de upgrade beginnen. De volledige lijst is te vinden in de Magento 2 Install Guide – System requirements.

Hoe voer je een update uit met Composer

De eerste stap is de volgende composer-plugin te installeren. Dit voert de integriteit controle uit tijdens de installatie, zoals hierboven is uitgelegd.

composer require magento/composer-root-update-plugin=~1.0

Om te zien welke Magento versies beschikbaar zijn, kan je het volgende uitvoeren.

composer show magento/product-community-edition '2.4.*' --available | grep -m 1 versions

Vervolgens kan je de juiste Magento versie installeren, in dit geval is dat 2.4.3.

composer require magento/product-community-edition=2.4.3

Dit voert de volledige upgrade uit, waarbij aan het einde van de update je het volgende kan uitvoeren om de huidige Magento versie te zien:

bin/magento --version

Nu kan het zo zijn dat tijdens de composer update een aantal errors naar voren zijn gekomen, waardoor de installatie is afgebroken. Zeker wanneer je van Magento 2.3.X naar Magento 2.4.X overstapt, zullen er zich problemen gaan voor doen.

Dit kan te maken hebben met de systeem requirements, dan raad ik je aan om de vorige stap “Voorbereidingen” nogmaals door te nemen. Ook heb je te maken met third-party modules, die ge-update dienen te worden. En ten slot kan het ook nog eens voorkomen dat er core patches geïnstalleerd moeten worden.

Dit zijn de problemen die wij zijn tegen gekomen, tijdens onze upgrade van Magento 2.3.5 naar 2.4.3.

Mogelijk problemen waar je rekening mee moet houden en hoe je deze kan oplossen

1. Class does not exsist

Magento 2.4 Class Magento\Framework\Search\Adapter\Mysql\Mapper does not exist

Dit heeft ermee te maken dat deze class verwijderd is, maar mogelijk dat third-party modules hier nog gebruik van maken. Dit kan je zien met de volgende command:

bin/magento dev:di:info "Magento\Framework\Search\Adapter\Mysql\Mapper"

Je zou de module kunnen updaten naar een latere versie waarin dit is aangepast. Mocht dat niet het geval zijn, dan zou je een refactor van de module moeten doen en de nodige classes overschrijven die niet meer worden gebruikt.

Voor meer informatie zie: https://devdocs.magento.com/guides/v2.4/release-notes/backward-incompatible-changes/index.html#elasticsearch en https://magento.stackexchange.com/questions/319437/magento-2-4-class-magento-framework-search-adapter-mysql-mapper-does-not-exist

2. Vertex + Braintree replacement packages

Problem 1
    - magento/project-community-edition 2.3.5 requires magento/product-community-edition 2.3.5 -> satisfiable by magento/product-community-edition[2.3.5] but these conflict with your requirements or minimum-stability.
    - don't install vertexinc/product-magento-module 4.2.1|remove magento/project-community-edition 2.3.5
    - remove magento/project-community-edition 2.3.5|remove vertexinc/product-magento-module 4.2.1
    - Installation request for magento/project-community-edition 2.3.5 -> satisfiable by magento/project-community-edition[2.3.5].
    - Installation request for vertexinc/product-magento-module 4.2.1 -> satisfiable by vertexinc/product-magento-module[4.2.1].

Je kan deze error oplossen dmv de order van de replacement packages aan te passen in composer.json:

"magento/module-braintree": "*",
"magento/module-braintree-graph-ql": "*",
"braintree/braintree_php": "*",
"braintree/braintree": "*",
"vertex/product-magento-module": "*",
"vertex/module-tax": "*",
"vertex/sdk": "*",
"vertex/module-address-validation": "*",

Voor meer informatie zie: https://www.yireo.com/blog/2020-07-24-what-is-wrong-with-my-magento2-replacements

3. Magento 2.4.3 Class ‘Zend\Serializer\Serializer’ not found

In ClassReader.php line 51:
  Impossible to process constructor argument Parameter #2 [  Zend\Serializer\Adapter\PhpSerialize $phpSerialize ] of Amasty\Base\Model\Serializer class  
                                                                                                                                        
In ClassReader.php line 71:  
  Class Zend\Serializer\Adapter\PhpSerialize does not exist

Dit heeft te maken dat in Magento >= 2.4.2 de laminas/laminas-serializer package is verwijderd, samen met andere laminas packages. In Magento 2.4.3 zijn de  laminas library dependencies ge-upgraded naar versies die compatible zijn met PHP 8.X.X.

Je zou de modules kunnen updaten die nog gebruik maken van de laminas/laminas-serializer package of een makkelijke fix is om de module weer te installeren:

composer require laminas/laminas-serializer
bin/magento setup:upgrade
bin/magento cache:flush

Zie ook: https://www.ulmod.com/blog/magento-2-4-3-class-zend-serializer-serializer-not-found/

4. PHP Fatal Error Hotfix

Fatal error: Uncaught Error: Call to undefined function Magento\Framework\Filesystem\Directory\str_contains() in /var/www/docroot/vendor/magento/framework/Filesystem/Directory/DenyListPathValidator.php:74
Stack trace:
#0 /var/www/docroot/vendor/magento/framework/Filesystem/Directory/CompositePathValidator.php(39): Magento\Framework\Filesystem\Directory\DenyListPathValidator->validate('/var/www/docroo...', 'config.php', NULL, false)
#1 /var/www/docroot/vendor/magento/framework/Filesystem/Directory/Read.php(80): Magento\Framework\Filesystem\Directory\CompositePathValidator->validate('/var/www/docroo...', 'config.php', NULL, false)
#2 /var/www/docroot/vendor/magento/framework/Filesystem/Directory/Write.php(359): Magento\Framework\Filesystem\Directory\Read->validatePath('config.php')
#3 /var/www/docroot/vendor/magento/framework/App/DeploymentConfig/Writer.php(146): Magento\Framework\Filesystem\Directory\Write->writeFile('config.php', '<?php\nreturn [\n...')
#4 /var/www/docroot/vendor/magento/inventory-composer-installer/src/D in /var/www/docroot/vendor/magento/framework/Filesystem/Directory/DenyListPathValidator.php on line 74

Het probleem wordt veroorzaakt omdat Magento 2.4.3- en 2.3.7-p1-versies str_contains gebruiken, wat pas in PHP8.X mogelijk is. Gezien 2.4.3 en 2.3.7-p1 alleen compatibel zijn met PHP 7.4, kan deze functie niet gebruikt worden en krijg je daarom deze error.

Dit kan je makkelijk oplossen door de volgende Magento patch te installeren.

https://support.magento.com/hc/en-us/articles/4408021533069-Adobe-Commerce-upgrade-2-4-3-2-3-7-p1-PHP-Fatal-error-Hotfix

Een andere manier is om Symfony Pollyfil / PHP8 te installeren, maar uit onze ervaring blijkt dat het beter is om de patch te installeren. Mocht je toch ervoor kiezen om deze composer package te installeren, dan kan dat als volgt:

composer require symfony/polyfill-php80

Om de patch te installeren kan je het volgende doen.

  1. Download en pak het volgende zip bestand uit, plaats de patch in /patches/composer/AC-384_Fix_Incompatible_PHP_Method__2.4.3_ce.patch
  2. Voeg het volgende toe in jouw composer.json bestand
    "extra": {
        "magento-force": "override",
        "composer-exit-on-patch-failure": true,
        "patches": {
            "magento/framework": {
                "Adobe Commerce upgrade 2.4.3, 2.3.7-p1 PHP Fatal error Hotfix": "patches/composer/AC-384__Fix_Incompatible_PHP_Method__2.4.3_ce.patch"
            }
        }
    },
  3. Vervolgens draai je composer install om de patch te installeren.

5. Problemen in third-party modules tijdens Magento upgrade

Dit zal voor iedereen anders zijn, maar een bekend issue waar wij tegen aan liepen waren 2 modules van Amasty. Hier kwamen de volgende error naar voren:

Warning: Declaration of Amasty\Shopby\Model\Layer\Filter\Price::_renderRangeLabel($fromPrice, $toPrice) should be compatible with Magento\CatalogSearch\Model\Layer\Filter\Price::_renderRangeLabel($fromPrice, $toPrice, $isLast = false) in /var/www/docroot/vendor/amasty/shopby/Model/Layer/Filter/Price.php on line 18

en

Fatal error: Declaration of Amasty\Customform\Model\Export\MetadataProvider::getRowData(Magento\Framework\Api\Search\DocumentInterface $document, $fields, $options) must be compatible with Magento\Ui\Model\Export\MetadataProvider::getRowData(Magento\Framework\Api\Search\DocumentInterface $document, $fields, $options): array in /var/www/docroot/vendor/amasty/module-magento-custom-form/Model/Export/MetadataProvider.php on line 17

De voorhand liggende oplossing is om deze modules te updaten. Vaak lost dit het dan ook op. Echter kan het ook voorkomen dat de module dit nog niet ondersteund. Hiervoor zou je dan zelf een patch voor kunnen maken.

In ons geval konden we de Amasty Shopby module updaten naar de laatste versie, dit loste het eerste probleem op.

composer update amasty/shopby^2.17

Jammer genoeg was dat niet het geval voor de Amasty Magento Custom Form module. Hiervoor hebben we de volgende patch gemaakt.

  1. Kopieer het volgende bestand in vendor/amasty/module-magento-custom-form/Model/Export/MetadataProvider.php naar de patches/Modified folder (maak deze eerst aan mocht je die nog niet hebben).
    cp vendor/amasty/module-magento-custom-form/Model/Export/MetadataProvider.php patches/Modified/MetadataProvider.php
  2. Pas hierbij de volgende functie voor aan:
    <?php ... /** * Returns row data * * @param DocumentInterface $document * @param array $fields * @param array $options * @return array */ public function getRowData(DocumentInterface $document, $fields, $options): array { $row = parent::getRowData($document, $fields, $options); $this->convertJsonData($row, $fields);
      
          return $row;
      }
      ...
  3. Voer nu de volgende command uit:
    diff -u vendor/amasty/module-magento-custom-form/Model/Export/MetadataProvider.php  patches/Modified/MetadataProvider.php > patches/composer_Fix_Declaration_of_Amasty_CustomForm_MetadataProvider.patch
  4. Pas nu de patch aan:
    diff -u a/vendor/amasty/module-magento-custom-form/Model/Export/MetadataProvider.php b/patches/Modified/MetadataProvider.php
    --- a/vendor/amasty/module-magento-custom-form/Model/Export/MetadataProvider.php    2021-10-08 19:06:06.201953254 +0200
    +++ b/patches/Modified/MetadataProvider.php    2021-10-08 19:06:00.693935143 +0200
  5. Ten slot voeg je het toe in jouw composer.json bestand en draai je composer install om de patch te installeren.
    "extra": {
      "magento-force": "override",
      "composer-exit-on-patch-failure": true,
      "patches": {
        "amasty/module-magento-custom-form": {
            "Amasty CustomForm 1.15.0 PHP Fatal error Fix": "patches/composer/_Fix_Declaration_of_Amasty_CustomForm_MetadataProvider.patch"
        }
    }

Update Magento 2.4.3 Samengevat

We weten nu: hoe we Magento kunnen updaten met composer, dat we hier de composer-root-update-plugin voor kunnen gebruiken, welke problemen mogelijk kunnen voorkomen bij zo’n update én hoe wij deze problemen kunnen oplossen.

Mochten er nog vragen, aan-of-opmerkingen zijn, neem dan contact met ons op!

Bronnen: