Conflicte în composer autoload

TL;DR: folosește __DIR__ când incluzi un fișier.

Recent am avut o situație tare interesantă în WordPress: folosesc composer autoload în mai multe locuri (câteva plugin-uri, temă) și la un proiect am început să primesc erori. Autoloader-ul nu mai găsea o clasă în temă.

Rulez composer dump în temă, nu mai găsește altă clasă în pluginul 1. Rulez composer dump în plugin, nu mai găsește o clasă în pluginul 2. Rulez și acolo composer dump, nu mai găsește clasa în temă. Și tot așa.

Niște chestii interesante în treaba asta:

  1. problema apărea doar dacă rulam în WP-CLI
  2. problema NU exista în producție.
  3. problema nu există la alte proiecte.

Până când am observat o chestie: la proiectele la care nu aveam problema asta, modul în care includeam autoload.php era ușor diferit:

require_once __DIR__ . '/vendor/autoload.php';

Față de cum aveam în proiectul curent:

require_once 'vendor/autoload.php';

O explicație a problemei găsești aici.

Folosești Composer în tema ta WordPress? Evită erorile la instalare!

De fiecare dată când folosesc Composer într-o temă sau într-un plugin încerc să am grijă de momentul în care trebuie să pornesc de la zero cu respectiva temă (sau plugin).

Cum folderul vendor este ignorat de Git, sunt șanse destul de mari ca tot codul meu să rezulte într-un minunat ecran alb (dacă erorile sunt oprite).

Codul de mai jos încearcă să prevină problema asta, verificând existența autoload.php.

function themeReqirementsWarning_ihdqnrwrbd()
{
	$message = __("Some files are missing from the dependencies list. Please make sure you've ran <code>composer update</code>!", 'felder');
	printf('<div class="error"><p>%s</p></div>', $message);
}

if (!file_exists(get_template_directory() . '/vendor/autoload.php')) {
	add_action('admin_notices', 'themeReqirementsWarning_ihdqnrwrbd');

	add_action('after_switch_theme', function () {
		switch_theme(WP_DEFAULT_THEME, WP_DEFAULT_THEME);
		unset($_GET['activated']);
		add_action('admin_notices', 'themeReqirementsWarning_ihdqnrwrbd');
	});
	return;
}

require_once dirname(__FILE__) . "/vendor/autoload.php";

windows apple dropbox facebook twitter