Model view controller 实现多租户应用程序(结构)
(这个问题不是关于数据库的。我知道当涉及到多租户时,通常会考虑数据库。但这不是我的问题。) 我创建了一个将由不同客户使用的应用程序。他们可以看到和做几乎相同的事情。然而,有些客户在这里或那里有一些额外的按钮,有些功能被禁用或其他一些不同 我想避免很多if/else或switch语句。所以我想我可以为每个客户提供一个通用模块和一个特殊模块,根据需要覆盖不同的内容。查看以下理论结构(所有文件都是正常的Yii文件): 我认为这是一个健全的文件结构。至少它是清晰易懂的。现在我想以某种方式了解一下:如果客户请求任何内容,应用程序将首先查看是否存在特定客户的文件并使用它们,或者是否使用常规模块(回退)中的文件。我的问题是:我该怎么做 如果可能,怎么做?还是仅部分可能,例如仅使用控制器和视图?我想视图/控制器/模型文件可能需要不同的方法。我认为类自动加载是可以调整的。我会考虑使用路由(尽管客户必须经过身份验证,因此它只能使用他或她自己的客户): 所有这些都可以通过配置或依赖项注入来完成吗?我是否需要模块或文件组织是否足够 (想法:覆盖控制器可能很简单。但我认为只有当控制器被覆盖以设置另一个视图路径时,视图文件才能被覆盖。) 有人有办法解决这个问题吗?如果这能与控制器和视图一起工作,我会很高兴。但是模特也不错。或者有人有其他建议或替代方法吗?让我知道,即使你只知道解决方案的一部分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文件): 我认为这是一个健全的文件结构。至少它是清晰易懂的。现在我想以某种方式了解一下:如果客
我认为一个令人满意的答案可能会随着时间的推移而演变。但找到一个好的解决方案对其他人来说是有帮助的。那么让我们来研究一下;-)。。。还是另一个框架更适合此任务-(您可以通过以下代码使用单独的主题:
@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',
],
],
],