6

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

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

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

我现在对 laravel 的工作原理有了更多了解,因此我能够追溯我的应用程序引用捆绑包服务的端点。在我的config/app.php文件中,我有服务提供商参考:

'Sentinel\SentinelServiceProvider',

SentinelServiceProvider服务有一个register注册RepoServiceProvider我需要重写的类的方法。

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

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

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

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

public function register()
{
    $loader = \Illuminate\Foundation\AliasLoader::getInstance();
    $loader->alias('Sentry', 'Cartalyst\Sentry\Facades\Laravel\Sentry');

    $repoProvider = new ExtendedRepoServiceProvider($this->app); // This would be my new ExtendedRepoServiceProvider class
    $repoProvider->register();

    $formServiceProvider = new FormServiceProvider($this->app);
    $formServiceProvider->register();
}

然后我会用config/app.phpExtendedSentinelServiceProvider类替换文件中的服务提供者引用:

'providers' => array(
    ...
    'Sentinel\ExtendedSentinelServiceProvider',
    ...
),

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

任何帮助将不胜感激。

4

1 回答 1

0

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

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

然后作曲家会在安装/更新时查看您的分叉。

于 2014-07-25T03:26:24.263 回答