我想扩展Kryptonit3/Counter。具体来说,我需要重写 Counter.php 类中的一个私有函数,以仅获取最近 24 小时的访问次数。
Counter.php 的私有函数:
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的自己的类,并在此类中包含我的自定义函数吗?如果是这样,原始类中包含的私有类会发生什么情况?我应该创建服务提供者吗?这个服务提供者会是什么样子?
方法二: 我应该复制供应商软件包并更新它以适应自己的需求吗?
我已经看过所有与此主题相关的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,
MyCounterFacade::showAndCount()
。由于你没有发布显示如何调用它的代码,所以我不能确定。如果是这种情况,你不应该在MyCounterFacade
上调用它。相反,你应该在counter::showAndCount()
中调用它,因为你在服务提供者中将其命名为门面。 - teynon