0

我想将类的方法重写get()Illuminate\Cache\Repository

<?php
namespace App\Illuminate\Cache;

use Illuminate\Cache\Repository as BaseRepository;

class Repository extends BaseRepository{

    public function get($key)
    {
        // changes
    }
}

但我不知道如何告诉 Laravel 加载我的类而不是原来的类。

有什么办法吗?


编辑 1

我创建了一个macro(),但它仅在该方法不存在时才有效BaseRepository,例如:

这不起作用

use Illuminate\Cache;

Cache\Repository::macro('get',function (){
    return 'hi';
});

但是,这有效:

use Illuminate\Cache;

Cache\Repository::macro('newName',function (){
    return 'hi';
});

所以macro不能这样做,因为 Laravel::macro()正在创建一个新函数但没有覆盖

4

1 回答 1

1

当你创建新的缓存对象时,很容易从你的类中创建一个实例,而不是 BaseRepository 类。

但是当 Laravel 的服务容器正在构建对象时(或使用依赖注入),您必须将扩展类绑定为 appServiceProvider 中的主类。

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Cache\Repository as BaseRepository;
use App\Illuminate\Cache\Repository;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind(BaseRepository::class, function ($app) {
            return $app->make(Repository::class);
        });
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

但是您必须将 \Illuminate\Contracts\Cache\Store 的实现传递给存储库的构造函数。

namespace App\Providers;

use Illuminate\Support\ServiceProvider;    
use Illuminate\Cache\Repository as BaseRepository;
use App\Repository;
use Illuminate\Cache\ArrayStore;


class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind(BaseRepository::class,function($app){
            return $app->make(Repository::class,['store'=>$app->make(ArrayStore::class)]);
        });
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}
于 2021-08-06T21:03:13.640 回答