Model view controller 实现多租户应用程序(结构)

Model view controller 实现多租户应用程序(结构),model-view-controller,routing,yii2,directory-structure,yii2-module,Model View Controller,Routing,Yii2,Directory Structure,Yii2 Module,(这个问题不是关于数据库的。我知道当涉及到多租户时,通常会考虑数据库。但这不是我的问题。) 我创建了一个将由不同客户使用的应用程序。他们可以看到和做几乎相同的事情。然而,有些客户在这里或那里有一些额外的按钮,有些功能被禁用或其他一些不同 我想避免很多if/else或switch语句。所以我想我可以为每个客户提供一个通用模块和一个特殊模块,根据需要覆盖不同的内容。查看以下理论结构(所有文件都是正常的Yii文件): 我认为这是一个健全的文件结构。至少它是清晰易懂的。现在我想以某种方式了解一下:如果客

(这个问题不是关于数据库的。我知道当涉及到多租户时,通常会考虑数据库。但这不是我的问题。)

我创建了一个将由不同客户使用的应用程序。他们可以看到和做几乎相同的事情。然而,有些客户在这里或那里有一些额外的按钮,有些功能被禁用或其他一些不同

我想避免很多if/else或switch语句。所以我想我可以为每个客户提供一个通用模块和一个特殊模块,根据需要覆盖不同的内容。查看以下理论结构(所有文件都是正常的Yii文件):

我认为这是一个健全的文件结构。至少它是清晰易懂的。现在我想以某种方式了解一下:如果客户请求任何内容,应用程序将首先查看是否存在特定客户的文件并使用它们,或者是否使用常规模块(回退)中的文件。我的问题是:我该怎么做

如果可能,怎么做?还是仅部分可能,例如仅使用控制器和视图?我想视图/控制器/模型文件可能需要不同的方法。我认为类自动加载是可以调整的。我会考虑使用路由(尽管客户必须经过身份验证,因此它只能使用他或她自己的客户):

所有这些都可以通过配置或依赖项注入来完成吗?我是否需要模块或文件组织是否足够

(想法:覆盖控制器可能很简单。但我认为只有当控制器被覆盖以设置另一个视图路径时,视图文件才能被覆盖。)

有人有办法解决这个问题吗?如果这能与控制器和视图一起工作,我会很高兴。但是模特也不错。或者有人有其他建议或替代方法吗?让我知道,即使你只知道解决方案的一部分


我认为一个令人满意的答案可能会随着时间的推移而演变。但找到一个好的解决方案对其他人来说是有帮助的。那么让我们来研究一下;-)。。。还是另一个框架更适合此任务-(

您可以通过以下代码使用单独的主题:

  • 覆盖yii\base\Theme
  • 使用依赖项插入来使用自定义 主题组件
  • 创建一个空的配置条目以创建主题 组件被调用
  • 创建/复制自定义主题文件
  • (或如何更换其他型号)

    此示例显示如何将“
    @app/views
    ”替换为“
    @app/themes/mytheme

    common\components\Theme.php(自定义主题组件)

    common\extensions\Bootstrap.php(DI的自定义引导)

    common\config\main.php(注册自定义引导)

    frontend\config\main.php(注册虚拟主题配置)

    app
        general
            controllers
                OrderController
                InvoiceController
                ShippingController
            views
                order
                    index, view, update, create, _form
                invoice
                    index, view, update, create, _form
                shipping
                    index, view, update, create, _form
                layout
                    main
            models
                Order
                Invoice
                Shipping
        customerA
            controllers
                OrderController  // some action is different
        customerB
            views
                invoice
                    view         // some buttons should be overridden
                layout
                    main.php     // other page structure
        customerC
            views
                order
                    index        // table gets some additional columns
            model
                Order            // has some more properties
        customerD
            // this customer exists but has nothing that must be changed
            // it uses all what is in general
        ...
    web
    common
    console
    ...
    
    http://example.com/customerA/invoice/view?id=1234
    
    namespace common\components;
    use Yii;
    
    class Theme extends \yii\base\Theme 
    {
    
        public function init() {
            // todo: your logic goes here
            $this->pathMap = [
                '@app/views' => [
                    '@app/themes/mytheme',
                ]
            ];
    
            return parent::init();
        }
    
    }
    
    namespace common\extensions;
    
    use Yii;
    use yii\base\Application;
    use yii\base\BootstrapInterface;
    use yii\helpers\Url;
    
    class Bootstrap implements BootstrapInterface
    {
        public function bootstrap($app)
        {
            Yii::$container->set(\yii\base\Theme::className(), \common\components\Theme::className());
        }
    }
    
    'bootstrap' => [
        'common\extensions\Bootstrap',
    ],
    
    'components' => [
        'view' => [
            'theme' => [
                'basePath' => '@app/views',
            ],
        ],
    ],