Laravel:覆盖bundle的服务提供商



我有一个项目使用了Laravel的Sentinel包。

前段时间,我问了一个关于扩展bundle中提供的模型的问题。我接受了这个答案,但它需要在vendor文件夹中编辑bundle的代码。

从那以后,我运行了一个composer update命令,我应用的更改被覆盖了(这并不奇怪)。

我现在对laravel的工作方式有了更多的了解,所以我能够追溯到bundle的服务被我的应用程序引用的终点。在我的config/app.php文件中,我有服务提供商引用:

'SentinelSentinelServiceProvider',

SentinelServiceProvider服务有一个register方法,注册RepoServiceProvider,这是我需要覆盖的类。

我计划创建两个新文件:ExtendedSentinelServiceProvider.phpExtendedRepoServiceProvider.php

ExtendedRepoServiceProvider.php文件中,我可以用我的自定义User类替换用于用户存储库绑定的类:

    // Bind the User Repository
    $app->bind('SentinelRepoUserUserInterface', function($app)
    {
        return new ExtendedSentryUser( // This is my custom model that I want the ExtendedRepoServiceProvider to use
            $app['sentry']
        );
    });

ExtendedSentinelServiceProvider.php文件中,我将用新修改的ExtendedRepoServiceProvider类替换现有的RepoServiceProvider类引用:

public function register()
{
    $loader = IlluminateFoundationAliasLoader::getInstance();
    $loader->alias('Sentry', 'CartalystSentryFacadesLaravelSentry');
    $repoProvider = new ExtendedRepoServiceProvider($this->app); // This would be my new ExtendedRepoServiceProvider class
    $repoProvider->register();
    $formServiceProvider = new FormServiceProvider($this->app);
    $formServiceProvider->register();
}

然后我将用新的ExtendedSentinelServiceProvider类替换config/app.php文件中的服务提供商引用:

'providers' => array(
    ...
    'SentinelExtendedSentinelServiceProvider',
    ...
),

我的问题是,这是否有意义作为一种方式,能够存储我的修改在我的应用程序目录,而不是修改供应商的代码?当涉及到名称间距时,这会成为一个问题吗?有更好的方法吗?

如有任何帮助将不胜感激

您不应该遇到名称间距问题。然而,另一种选择——特别是如果你要添加一个可能对其他人有用的功能——是在github上分叉项目,然后在composer.json的"repositories"属性中包含对git项目的引用。例如,您可以添加:

"repositories": [
    {
        "type": "git",
        "url": "git@github.com:{your-user}/Sentinel.git"
    }
],

然后composer会在每次安装/更新时查看你的fork

最新更新