【问题标题】:Laravel shared project codebaseLaravel 共享项目代码库
【发布时间】:2017-09-06 07:21:40
【问题描述】:

我已经搜索了几天,但我认为我在任何地方都没有找到相关的问题。

有没有办法让多个“子项目/站点”为它们的控制器和模型使用共享代码库,但有自己的路由和视图。

例如:public/site1 和 public/site2 有自己的 /views、/routes 文件夹和自己的 .env,但都使用相同的 /app 代码。

这些子项目将全部位于同一台服务器上,因此如果有其他解决方案,其中将有多个应用程序可以链接来自 1 个主“核心”应用程序的控制器和模型也是可能的。

编辑:如果有一种方法可以从服务器上的其他位置自动加载例如模型和控制器,我正在寻找更多,只要我更新“核心”,一旦它被用于所有子项目。

【问题讨论】:

  • 看看public/index.php 每个使用相同代码库的应用程序都应该有自己的公用文件夹和应用程序文件夹,并且该文件内的路径正确。

标签: laravel laravel-5.4


【解决方案1】:

例如,您可以使用这样的结构为所需的每个子站点创建目录和命名空间。

  • 应用程序
    • Http(用于共享控制器)
    • 模型(用于共享模型)
  • 站点1
    • http
    • 型号
  • 站点2
    • http
    • 型号
  • 路线
    • shared.php
    • site1.php
    • site2.php

您需要在composer.json 中注册它们,例如:

"autoload": {
    "psr-4": {
        "App\\Shared\\": "app/",
        "App\\Site1\\": "site1/",
        "App\\Site2\\": "site2/"
    }
},

RouteServiceProvider 中,您可以使用不同的域或子域路由每个路由文件,并为每个文件添加shared.php(例如,用于身份验证路由)。它可能看起来像:

protected function mapSite1Routes()
{
    Route::group([
        'domain'     => config('sites.site1.domain'),
        'namespace'  => $this->namespace,
        'middleware' => ['web'],
    ], function () {
        require base_path('routes/shared.php');
        require base_path('routes/site1.php');
    });
}

这样您就拥有一个具有共享和单独源的应用程序。

这应该让你开始:)

【讨论】:

  • 这是否包括每当我更改“核心”包时我不必在所有子项目中重新部署它?
  • 你是对的,我错过了那一点。用不同的方法改变了我的答案。
【解决方案2】:

其实我自己也做过。我自己的一个项目是多租户内容管理系统。有核心的 CMS 代码库,然后我为每个“租户”创建一个包,其中包含该租户的路由、视图、资源等。

每个包都通过 Composer 包含,并且与任何其他 Laravel 项目具有相同的目录:

  • /公共
    • /css
    • /img
    • /js
  • /资源
    • /资产
      • /sass
    • /查看次数
  • /路线
    • web.php
  • /src
    • /控制台
      • /命令
    • /http
      • /控制器
    • PackageNameServiceProvider.php

不过,服务提供者类有点“hack-y”。我必须这样做:

class PackageNameServiceProvider extends ServiceProvider
{
    public function boot()
    {
        if ($this->app->runningInConsole()) {
            $this->defineAssetPublishing();
            $this->defineConsoleCommands();
        }

        if ($this->app->make(Tenant::class)->name == 'This Tenant') {
            $this->defineRoutes();
            $this->defineResources();
        }
    }
}

如果我能摆脱if ($this->app->make(Tenant::class)->name == 'This Tenant') 位就好了。但是,到目前为止,它对我来说一切正常。

【讨论】:

    猜你喜欢
    • 2019-04-11
    • 2017-07-11
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    相关资源
    最近更新 更多