Advertisement

Responsive Advertisement

Solusi Masalah LIBXML dan DOMNode package nunomaduro/termwind laravel

You said:
saya mendapati error saat menjalankan artisan laravel di arch

Termwind\ValueObjects\Node::__construct(): Argument #1 ($node) must be of type DOMNode, null given, called in /home/kentok/Documents/kantor/golf-membership/vendor/nunomaduro/termwind/src/HtmlRenderer.php on line 43 beberapa di forum berkomentar - on Apr 24, 2025 check libxml2 version from PHP info. seems like it using older/latest version which breaking the functionality of Termwind on laravel package! sadly there's no option to downgrade the PHP.😖 there's another way, try compiling PHP on termux env. never tried it.🤣 i solved it temporarily, remove ENUM LIBXML_NOXMLDECL in source file nunomaduro\Termwind\src\ filename HtmlRenderer.php(line 31). install laravel until you got the error and edit the corresponding file and run composer dumpautoload, next time you use laravel no more the same error.
ChatGPT said:

Error tersebut berasal dari Termwind, yang digunakan Laravel (terutama di Laravel 10 dan 11) untuk menampilkan output berwarna di terminal.

Masalah ini muncul karena incompatibility antara versi libxml2 yang digunakan oleh PHP di sistem kamu (Arch Linux) dan cara Termwind memproses HTML menggunakan DOMDocument.


💥 Penyebab Utama

DOMDocument::loadHTML() mengembalikan null karena gagal memuat HTML yang diberikan. Lalu ketika Termwind mencoba membuat objek dari null, muncullah error ini:

php
Termwind\ValueObjects\Node::__construct(): Argument #1 ($node) must be of type DOMNode, null given

Solusi Sementara (Workaround)

Kamu bisa patch file HtmlRenderer.php di baris yang menyebabkan masalah, seperti yang sudah kamu temukan di forum:

1. Edit file ini:

bash
vendor/nunomaduro/termwind/src/HtmlRenderer.php

2. Temukan baris ini (sekitar baris 31):

php
$dom->loadHTML($html, LIBXML_NOXMLDECL);

3. Ubah menjadi seperti ini (hilangkan flag):

php
$dom->loadHTML($html);

Opsi LIBXML_NOXMLDECL adalah enum/konstanta dari libxml yang tampaknya tidak dikenali atau bermasalah di versi libxml2 milik Arch.

4. Jalankan ulang autoload:

bash
composer dump-autoload

🧼 Alternatif Lebih Permanen

Kalau kamu tidak ingin mengubah vendor file setiap install ulang:

Gunakan Laravel Pint atau Artisan tanpa tampilan Termwind:

bash
php artisan list --no-ansi php artisan migrate --no-interaction --no-ansi

Atau, install Laravel tanpa efek visual:

bash
php artisan --no-ansi

🧪 Cara Cek Versi libxml yang digunakan PHP

Jalankan:

bash
php -i | grep libxml

Contoh output:

java
libxml Version => 2.12.0 libxml streams => enabled

Versi libxml2 >= 2.12 dilaporkan memunculkan banyak incompatibility dengan berbagai paket PHP yang mengandalkan DOMDocument.


🚧 Solusi Lebih Permanen (Opsional)

  • Downgrade PHP kamu agar menggunakan libxml2 versi lama, atau

  • Compile PHP secara manual dengan libxml2 versi tertentu, tapi ini cukup teknis dan rawan rusak dependency sistem lain di Arch Linux.


Mau saya bantu buat skrip patch otomatisnya biar tidak perlu manual edit setiap kali install ulang?

You said:
ssaya sudah downgrade ke 83 tapi masih tidak work
ChatGPT said:

Terima kasih sudah mencoba downgrade ke PHP 8.3 — tapi sayangnya, masalahnya bukan di versi PHP-nya, melainkan di versi libxml2 yang digunakan oleh PHP saat dikompilasi. Di Arch Linux, library seperti libxml2 akan tetap versi terbaru, kecuali kamu benar-benar compile PHP sendiri dengan libxml2 versi lama.


🔍 Ringkasan Masalah

  • Termwind pakai DOMDocument::loadHTML($html, LIBXML_NOXMLDECL)

  • Di versi libxml2 2.12.x ke atas, penggunaan flag LIBXML_NOXMLDECL bisa bikin loadHTML() gagal → return null

  • Termwind tidak mengecek apakah parsing berhasil → error saat mencoba menggunakan null sebagai DOMNode


✅ Solusi Paling Praktis (Direkomendasikan)

Karena kamu tidak bisa/darurat downgrade libxml2, solusi tercepat dan paling aman adalah patch file vendor Termwind:

1. Edit file:

swift
vendor/nunomaduro/termwind/src/HtmlRenderer.php

2. Ubah baris:

php
$dom->loadHTML($html, LIBXML_NOXMLDECL);

Menjadi:

php
$dom->loadHTML($html);

3 Jalankan:

bash
composer dump-autoload

Dan Artisan bisa dijalankan tanpa error lagi.


🔄 Bonus: Patch Otomatis via Composer Script

Biar kamu nggak perlu edit manual setiap kali composer install/update, tambahkan script di composer.json:

json
"scripts": { "post-install-cmd": [ "@php patch-termwind" ], "post-update-cmd": [ "@php patch-termwind" ], "patch-termwind": [ "sed -i 's/\\$dom->loadHTML(\\\$html, LIBXML_NOXMLDECL);/\\$dom->loadHTML(\\\$html);/' vendor/nunomaduro/termwind/src/HtmlRenderer.php" ] }

Setelah itu jalankan:

bash
composer run-script patc-termwind

🔧 Atau, Disable Termwind Sepenuhnya?

Kalau kamu tidak butuh output HTML warna di terminal, kamu bisa buat alias:

bash
alias artisan='php artisan --no-ansi'

Butuh bantuan buat setup patch otomatis atau buat fallback agar Termwind tidak error meski DOMDocument gagal?

You said:
php -i | grep libxml libxml Version => 2.14.2 libxml libxml2 Version => 2.14.2 libxslt compiled against libxml Version => 2.14.2
ChatGPT said:

Nah, ini dia penyebab pastinya:

java
libxml Version => 2.14.2

Versi libxml2 >= 2.12 (kamu pakai 2.14.2) memang bermasalah dengan DOMDocument::loadHTML() saat menggunakan flag seperti LIBXML_NOXMLDECL. Banyak package PHP lain juga terdampak, termasuk Termwind, PHPUnit DOM, dll.


⚠️ Kenapa DOMDocument::loadHTML($html, LIBXML_NOXMLDECL) error di libxml2 2.14?

Karena versi baru libxml2 (sejak 2.12) mulai lebih strict dan kadang menolak atau gagal memuat HTML, terutama jika ada flag yang tidak cocok — alhasil loadHTML() return false atau null.


✅ Solusi Paling Stabil untuk Sekarang

🛠 1. Patch Termwind

Edit file:

swift
vendor/nunomaduro/termwind/src/HtmlRenderer.php

Ubah:

php
$dom->loadHTML($html, LIBXML_NOXMLDECL);

Menjadi:

php
$dom->loadHTML($html);

Lalu jalankan:

bash
composer dump-autoload

Catatan: Ini perlu kamu ulangi setiap kali composer install atau composer update, kecuali kamu pasang patch otomatis (lihat poin 2).


🧠 2. Tambahkan Patch Otomatis di composer.json

Supaya nggak ngedit manual terus:

json
"scripts": { "post-install-cmd": [ "@php patch-termwind" ], "post-update-cmd": [ "@php patch-termwind" ], "patch-termwind": [ "sed -i 's/\\$dom->loadHTML(\\\$html, LIBXML_NOXMLDECL);/\\$dom->loadHTML(\\\$html);/' vendor/nunomaduro/termwind/src/HtmlRenderer.php" ] }

Lalu tinggal jalankan:

bash
composer run-script patch-termwind

🔮 Apakah Akan Diperbaiki Secara Resmi?

Belum ada patch resmi dari Termwind karena mereka mengandalkan perilaku lama dari libxml2. Bisa jadi nanti akan ada update yang menangani ini lebih baik (misalnya dengan pengecekan hasil loadHTML()), tapi untuk saat ini solusi patch manual atau script adalah cara paling stabil di Arch Linux.


Mau saya bantu buatkan skrip shell atau .patch file untuk automatisasi sepenuhnya?

Posting Komentar

0 Komentar