我正在尝试扩展 Kryptonit3/Counter .特别是,我需要覆盖 Counter.php 类中的一个私有(private)函数以仅检索过去 24 小时内的点击次数。
Counter.php 私有(private)函数:
private static function countHits($page)
{
$page_record = self::createPageIfNotPresent($page);
return number_format($page_record->visitors->count());
}
我需要的功能:
private static function countHits($page)
{
$page_record = self::createPageIfNotPresent($page);
return number_format($page_record->visitors()->where('created_at', '>=', Carbon::now()->subDay())->count());
}
因此,我正在寻找覆盖此包的正确方法。
方法一 : 我应该创建自己的类来扩展 Counter.php 并在这个类中包含我的自定义函数吗?如果是这样,原始类中包含的私有(private)类会发生什么情况?我应该创建一个服务提供者吗?这个服务提供者会是什么样子?
方法二 : 我应该 fork 供应商包并根据我自己的需要更新这个包吗?
我已经查看了与此主题相关的所有 stackoverflow 问题,但它们还不够清楚。
更新:
这是我到目前为止所做的:
创建 MyCounter 类:
<?php
namespace App\Helpers\Counter;
use Kryptonit3\Counter\Counter;
class MyCounter extends Counter
{
}
创建 MyCounterServiceProvider:
<?php
namespace App\Providers;
use App\Helpers\MyCounter;
use Illuminate\Support\ServiceProvider;
class MyCounterServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app['counter'] = $this->app->share(function($app)
{
$visitor = $app['visitor'];
return new MyCounter($visitor);
});
}
}
创建 MyCounterFacade:
<?php
namespace App\Helpers\Counter;
use Illuminate\Support\Facades\Facade;
class MyCounterFacade extends Facade
{
protected static function getFacadeAccessor() { return 'mycounter'; }
}
在 config/app.php 中包含提供者和别名:
App\Providers\MyCounterServiceProvider::class,
和
'MyCounter' => App\Helpers\Counter\MyCounterFacade::class,
最佳答案
问题与 MyCounterServiceProvider 有关。下一段代码解决了这个问题。
public function register()
{
$this->app->singleton('mycounter', function() {
return $this->app->make('App\Helpers\Counter\MyCounter');
});
}
关于php - 如何扩展 Laravel 供应商包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41242301/