如何在Laravel 5.4中跨越(新类)外观?

时间:2018-09-26 12:01:33

标签: laravel laravel-facade

我上了下面的课

<?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 :(得分:0)

在回答之前,我建议包装,进行修改并使用叉子。因为如果程序包中发生某些更改,您的覆盖可能不再起作用。

  

让我们看一下包装。

您有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. 创建自己的serviceProvider
    $ 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);
        });
    }
}
  1. Laravel 5.5 + 在您的composer.json中,从自动发现中删除服务提供商
"extra": {
    "laravel": {
        "dont-discover": [
            "Casinelli\\Currency\\CurrencyServiceProvider"
        ]
    }
},

现在,当您调用\Currency::rounded()时,它将调用您自己的货币实现。

您不需要更改立面。

答案 1 :(得分:0)

错误消息/异常非常令人误解...

此问题是由于致电App\Currency::rounded而不是:Casinelli\Currency\Facades\Currency::rounded ...