Composer: override di una classe vendor

Può capitare di dover modificare una funzione di una libreria gestita tramite Composer, per modificarne il funzionamento in base a esigenze particolari.
Ho avuto questa necessità utilizzando kkomelin/laravel-translatable-string-exporter, che permette in Laravel di cercare le traduzioni presenti nell'applicazione e le esporta in un file json, con una semplice riga dal terminale:

php artisan translatable:export it

Il file json come default veniva creato in resources/lang, ma questo portava a un errore in alcuni componenti Wire UI.
Per risolvere velocemente il problema ho deciso di modificare il metodo che restituisce la path in cui scrivere il file, ovvero facendolo scrivere nella directory lang principale.

Il metodo in questione è languageFilePath, che si trova all'interno di vendor\kkomelin\laravel-translatable-string-exporter\src\Core\Utils\IO.php.

All'interno del composer.json ho indicato quindi il percorso per sovrascrivere questa classe, andandola a cercare all'interno di una nuova directory vendor_override (all'interno della quale ho mantenuto la stessa struttura della libreria, ma non è obbligatorio farlo)

"autoload": {
    "psr-4": {
        "KKomelin\\TranslatableStringExporter\\Core\\Utils\\": "vendor_override/KKomelin/TranslatableStringExporter/Core/Utils/"
    }
},

Quindi ho copiato la classe IO.php originale in vendor_override\KKomelin\TranslatableStringExporter\Core\Utils\IO.php e modificato il metodo da

public static function languageFilePath(string $language)
{
    return function_exists('lang_path') ? lang_path("$language.json") : resource_path("lang/$language.json");
}

a

public static function languageFilePath(string $language)
{
    return realpath('lang').DIRECTORY_SEPARATOR."$language.json";
}

ovvero forzando il percorso del file json da creare.

Prima di usare nuovamente la libreria è necessario eseguire il comando dump-autoload per aggiornare i percorsi

composer dump-autoload

e a questo punto il comando

php artisan translatable:export it

salverà il file nella posizione desiderata.


Commenti