Как мне переехать (новый класс) фасад в Laravel 5.4? - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть следующий класс

<?php

namespace App;


class Currency extends \Casinelli\Currency\Currency
{

    /**
     * Create a new instance.
     *
     * @param \Illuminate\Foundation\Application $app
     */
    public function __construct($app)
    {
        parent::__construct($app);
        $this->setCurrency(getCurrency());
    }
}

Я заменил 'псевдонимы' в app.php:

   - 'Currency' => \Casinelli\Currency\Facades\Currency::class,
   + 'Currency' => \App\Currency::class,

Однако я сталкиваюсь с ошибкойиз:

Non-static method Casinelli\Currency\Currency::rounded() should not be called statically

Кажется, мой класс Currency не рассматривается как Facade ... Как бы я решил эту проблему?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Сообщение об ошибке / исключение очень вводит в заблуждение ...

Проблема была вызвана вызовом App\Currency::rounded вместо: Casinelli\Currency\Facades\Currency::rounded ...

0 голосов
/ 26 сентября 2018

Прежде чем ответить, я рекомендую fork посылку, внесите свои изменения и используйте свою вилку.Потому что, если что-то изменится в пакете, ваше переопределение может больше не работать.

Давайте посмотрим на пакет.

У вас есть 3 важных файла:

Валюта, которую вы хотите расширить: https://github.com/Casinelli/Currency/blob/master/src/Casinelli/Currency/Currency.php

Фасад, который вы хотите использовать: https://github.com/Casinelli/Currency/blob/master/src/Casinelli/Currency/Facades/Currency.php

И, наконец, ServiceProvider, который регистрирует класс, который вы хотите расширить: https://github.com/Casinelli/Currency/blob/master/src/Casinelli/Currency/CurrencyServiceProvider.php#L60

Поставщик услуг зарегистрирует class валюту как одиночную с псевдонимом currency

Затем, когда вы вызываете facade валюту, он будет выглядетьдля псевдонима currency и возврата экземпляра class валюты.

Реализация собственной валюты

Чтобы использовать собственную валюту class, выВам нужно будет зарегистрировать собственную реализацию валюты class в сервис-провайдере, который заменит сервис-провайдера пакета.

  1. Создайте свой собственный сервис-провайдер
    $ php artisan make:provider ExtendedCurrencyServiceProvider

  2. В вашем файле app/config/app.php,
    Замените Casinelli\Currency\CurrencyServiceProvider::class,
    на App\Providers\ExtendedCurrencyServiceProvider::class,

  3. У вашего нового поставщика услуг измените на
<?php

namespace App\Providers;

use Casinelli\Currency\CurrencyServiceProvider;

class ExtendedCurrencyServiceProvider extends CurrencyServiceProvider
{
     /**
     * Register currency provider.
     */
    public function registerCurrency()
    {
        $this->app->singleton('currency', function ($app) {
            return new App\Yournamespace\CurrencyClass($app);
        });
    }
}
Laravel 5.5 + В вашем composer.json удалите поставщика услуг из автообнаружения
"extra": {
    "laravel": {
        "dont-discover": [
            "Casinelli\\Currency\\CurrencyServiceProvider"
        ]
    }
},

Теперь, когда вы будете звонить \Currency::rounded() это вызовет вашу собственную реализацию валюты.

Вам не нужно менять Фасад.

...