在Laravel中为共享组件配置包中的文件

lin*_*ngo 5 php laravel composer-php laravel-5 laravel-5.5

介绍

我有一个庞大的项目,其中包含许多负责不同事物的Laravel项目.项目部分共享相同的数据库(用户,权限,角色,日志......),例如,有一个项目用于处理所有其他项目的用户数据和权限.

因此,在这种情况下,项目中存在重复的模型(用户,权限,角色).我通过构建独立包来解决它,将其作为Composer包包含在共享这些模型的所有项目中.

问题

我的问题是关于必需的包的配置.例如,现在我使用Spatie的Permission包来处理权限和角色.我的每个项目都在这些包中共享相同的配置更改.

  • 有没有办法在我的共享包中处理这些配置?
  • 一个包可以覆盖另一个配置文件吗?
  • Laravel如何实际处理所需包中存在同名配置文件的情况?

Mat*_*ley 2

创建共享服务

您可以创建一个包并让所有项目将其注册为依赖项。使用该包覆盖所有依赖项配置文件。

在共享服务中,您需要为每个要覆盖的服务提供者创建一个服务提供者。扩展依赖项的服务提供者并使用该register方法加载您自己的配置文件而不是依赖项的配置文件。

例如:

class SharedPermissionServiceProvider extends PermissionServiceProvider
{
    public function register()
    {
        if (isNotLumen()) {
            $this->mergeConfigFrom(
                __DIR__.'/../config/permission.php',
                'permission'
            );
        }

        $this->registerBladeExtensions();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用 Laravel 5.5 或更高版本,您可能需要为每个依赖项选择退出包自动发现,以防止使用依赖项的服务提供程序。相反,请在您的网站中注册您的服务提供商composer.json

如果您使用 Laravel 5.4 或更低版本,或者您要覆盖不使用自动发现的服务提供程序,请从您的依赖项中删除服务提供程序config/app.php并添加您自己的服务提供程序。