Переопределить псевдонимы, определенные в пакете composer.json, с помощью определенных в конфигурации Laravel приложений - PullRequest
1 голос
/ 20 июня 2019

Я использую 3 пакета в своем приложении Laravel 5.8:

Они конфликтуют, потому что Backpack Base использует глобальный псевдоним для «Alert», настроенного на использование PrologueAlert.Посмотрите пример того, как он использует \Alert здесь:

private function checkLicenseCodeExists()
{
    if ($this->app->environment() != 'local' && !config('backpack.base.license_code')) {
        \Alert::add('warning', "<strong>You're using unlicensed software.</strong> Please ask your web developer to <a target='_blank' href='http://backpackforlaravel.com'>purchase a license code</a> to hide this message.");
    }
}

Источник: https://github.com/Laravel-Backpack/Base/blob/1.1.4/src/BaseServiceProvider.php#L264

Поскольку я еще не купил эту лицензию, я начал видеть ошибку, вызваннуюпотому что этот фрагмент кода пытался передать строку в Alert :: add (), но вызывал метод add() в Styde \ Html \ Alert \ Container :: add (), который ожидает, что параметр является экземпляром Styde \Html \ Alert \ Message вместо вызова его в версии Alert от Prologue, которая принимает строку.Он называет неправильный «Оповещение»!

Несмотря на то, что мое приложение специально настроено на использование PrologueAlert для Alert

// config/app.php

'aliases' => [
    ...
    'Alert' => Prologue\Alerts\Facades\Alert::class
]

Я обнаружил, что причина в том, что в версии 1.7 Стид переместил псевдонимы для своего пакета из защищенного $Переменная globalAliases в HTMLServiceProvider.php в секцию автообнаружения composer.json

"extra": {
    "laravel": {
        "providers": [

        ],
        "aliases": {
            "Field": "Styde\\Html\\Facades\\Field",
            "Alert": "Styde\\Html\\Facades\\Alert",
            "Menu": "Styde\\Html\\Facades\\Menu",
            "Form": "Collective\\Html\\FormFacade",
            "Html": "Collective\\Html\\HtmlFacade"
        },
        "dont-discover": [
            "laravelcollective/html"
        ]
    }
}

Источник: https://github.com/StydeNet/html/commit/f51138fb42bef458f3f0e101b98344162b7327ba#diff-b5d0ee8c97c7abd7e3fa29b9a27d1780

Теперь, похоже, мое приложение отдает приоритет псевдониму Стида "Оповещение "по поводу моего собственного значения набора приложений!

Кроме того, чтобы откатиться на использование версии 1.6 Styde, как я могу заставить Laravel расставить приоритеты моих собственных определенных псевдонимов над теми, которые были обнаружены через composer.json?

1 Ответ

2 голосов
/ 20 июня 2019

Я нашел решение!Это было фактически вдохновлено фрагментом в моем оригинальном посте.

Вы можете добавить extra секцию к composer.json вашего приложения, которая будет прочитана приложением Laravel и использована для решения, какие пакеты игнорировать при автообнаружении, например:

// composer.json
{
    ...
    "extra": {
        "laravel": {
            "dont-discover": [
                "styde/html"
            ]
        }
    }
}

Это затем позволяет вам выбирать псевдонимы из проблемного пакета и определять столько, сколько вам нужно, в вашем config/app.php (для моего приложения я использовал только псевдоним Field из Styde/ Html, так что это было единственное, что я должен был добавить в мою конфигурацию приложения) .

Я думаю, что по мере того, как все больше сопровождающих пакетов начнут использовать функцию автообнаружения, эта функция станет более широко используемой.

Запоздалая мысль: Это сдвиг в отношениях между Композитором и Laravel.В то время как файл composer.json традиционно представлял собой просто менеджер пакетов, который запускался при установке, а затем не использовался во время работы приложения, теперь он является файлом конфигурации, который читается приложением.Я усвоил этот трудный путь, поскольку наш конвейер упаковывает и развертывает код, используемый для очистки файлов, которые не требовались в производственной среде.Он удалял composer.json, что снова привело к возникновению ошибки в нашей среде контроля качества.

...