问题标签 [yii2-module]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
model-view-controller - 实现多租户应用(结构)
(这个问题与数据库无关。我知道在多租户方面通常会考虑数据库。但这不是我的问题。)
我创建了一个可供不同客户使用的应用程序。他们可以看到并做大部分相同的事情。但是,有些客户在这里和那里有一些额外的按钮,某些功能被禁用或其他一些不同。
我想避免大量的 if/else 或 switch 语句。所以我想我可以为每个客户提供一个通用模块和特殊模块,根据需要覆盖或覆盖不同的东西。看下面的理论结构(所有文件都是正常的 Yii 文件):
我认为这是一个合理的文件结构。至少它是清晰易懂的。现在我想以某种方式实现:如果客户请求任何东西,如果有特定客户的文件并使用它们,或者使用通用模块(后备)中的文件,应用程序将首先查看。我的问题是:我该怎么做?
如果可能,怎么做?还是仅部分可能,例如仅使用控制器和视图?我想视图/控制器/模型文件可能需要不同的方法。我想可以调整类自动加载。而且我会考虑使用路由(尽管客户必须经过身份验证,所以它只能使用他或她自己的客户):
所有这些都可以通过配置或依赖注入来完成吗?我需要模块还是文件组织足够?
(想法:覆盖控制器可能很简单。但我认为只有在控制器被覆盖以设置另一个视图路径时才能覆盖视图文件。)
有没有人有解决这个问题的想法?如果这适用于控制器和视图,我会很高兴。但是模型也很好。或者有没有人有其他建议或替代方法?即使您只知道部分解决方案,也请告诉我。
我认为一个令人满意的答案可能会随着时间的推移而发展。但这将有助于其他人找到一个好的解决方案。所以让我们继续努力吧 ;-) ... 或者是另一个框架更适合这个任务?:-(
yii - 模块中的路由不起作用 Yii 2
我是 Yii 2 的新手,我的问题是关于模块内部的路由。我的应用程序中有一个模块,它是用户和管理员的配置文件柜。我创建了一个 CabinetController 而不是 DefaultController,还创建了一个 AdminController 和 UserController。
我想要的是?我希望这个 CabinetController 收到请求,并在验证用户是否为管理员后将其转发给 AdminController 或 UserController。
在配置文件中,我将模块的默认路由设置为“cabinet”(据我所知,这是默认控制器的名称)。在 UrlManager 的“规则”部分,我写了以下内容:
如果我转到“my-site.com/cabinet”,它可以正常工作并打开“admin/index”,因为我已经将此请求重新定向到 AdminController/actionIndex,但是一旦我转到“my-site.com/”之类的地方机柜/用户”它以 404 NotFound 响应。我打开记录器并看到: 异常 'yii\base\InvalidRouteException' 带有消息“无法解析请求“内阁/桌面”
这是我的 CabinetController 以及我将请求转发给 Admin/UserController 的方式:
如果我在 CabinetController 中更改 defaultAction,它会按预期正常运行此操作。或者,如果我再次访问“my-site.com/cabinet/admin/users”,它工作得很好,因为它在 url 中找到了一个控制器(我认为)。
css - Yii2 资产:如何在 CSS 文件中使用图像资产?
我想创建一个包含 的扩展AssetBundle
,它提供了一个简单的静态 CSS 文件。在那个静态 CSS 文件中,我想使用一个图像文件,它也是扩展的一部分。
如何知道图像文件的 URL,以便在 CSS 文件中使用它?
如果我将图像文件注册为资产,它将获得一个我们无法预测的随机 URL !所以不可能做这样的事情:
.some-selector {
background: url('/assets/?????/image.jpg');
}
那么,如何做到这一点呢?
为了进一步说明,以下是此类扩展的示例文件夹结构:
extension/Widget.php
- 一些注册我们 AssetBundle 的小部件extension/AssetBundle.php
- 注册 css 的资产包extension/assets/css/style.css
- CSSextension/assets/images/image.jpg
- 我们要在里面使用的图像style.css
yii2 - 迷失在yii2模块i18n翻译中
我正在尝试将多语言功能添加到我在俄语中找到的模块中,但是当我尝试实现它时遇到问题,可能是配置,不确定。
我像往常一样在应用程序中进行了文本替换:
'部门' => Yii::t('app', '部门'),
然后我用 message 命令生成了翻译文件,到目前为止一切都很好,我得到了正确的结构:
然后我在 yii2-ticket 模块文件的 init 中添加了一个函数:
我在一个基于高级应用程序的 yii2 应用程序中使用这个模块,在配置文件中我有以下内容:
...
在开发模式下运行应用程序我在日志中没有收到任何错误。
但是,如果我将 en/app.php 文件复制到我的应用程序的 common/messages/en 文件夹中,它就可以工作。
但我希望从模块中运行翻译,以便其他人可以基于一般配置使用它。
已编辑
在玩弄并从 csminb 答案中理解之后,我从我的主应用程序中删除了所有 i18n 配置。
1-我在模块硬编码文本中进行了所有翻译,如下所示:
2- 在我的控制台/配置文件夹中创建配置文件 ./yii message/config @app/config/i18n-ricco.php
3-编辑添加语言和正确的路径
];
4-运行消息命令
message 命令使用 ticket.php 文件生成所有语言文件夹。
5-在模块的init函数中增加了配置:
php - Yii2 加载模块
如何加载外部站点模块?我有一个公共模块需要在不同的 Yii2 站点中加载,例如高级模板,我的想法是有一个公共目录来存储我可以加载到每个站点的通用模块。文件系统结构可以是这样的:
/
site-1/
(loads modules from common-modules dir for site-1)
site-2/
(loads modules from common-modules dir for site-2)
common_sites_modules/
module-1/
module-2/
carrello/
Carrello.php
他的配置中的每个站点都必须从加载模块common-modules/
是否有可能实现这种结构?
编辑 1
配置:
'cart' => [
'class' => dirname(dirname(dirname(__DIR__))) . '/common_sites_modules/carrello/Carrello',
'params' =>[
...
],
'components' => [
...
],
],
这是 Carrello.php 类的第一行:
<?php
namespace common_sites_modules\carrello;
...
编辑2:
感谢@Yupik 的支持和建议,新设置:
引导程序.php:
Yii::setAlias('@common-modules', dirname(dirname(dirname(__DIR__))) . '/common_sites_modules');
主要本地.php:
'class' => '@common-modules\carrello\Carrello',
生成的错误:
就像评论中建议的那样,解决方案是声明一个别名,然后使用别名的名称来调用模块。就像@Yupik 建议的那样,我在 common/config/bootstrap.php 中设置了一个别名,如下所示:
Yii::setAlias('@common_modules', dirname(dirname(dirname(__DIR__))) . '/common_modules');
在主要配置中:
'carrello' => [
'class' => ''common_modules\carrello\Carrello',
...
]
显然,必须根据文件系统上的位置配置命名空间。感谢您的建议
yii2 - 我如何强制 yii2 模块为他的所有模型使用特定的连接?
在一个模块上,我添加了一个名为 db 的组件,就像主要 Yii 组件一样,用于数据库连接的数据,我需要在我的模块中使用他的配置中为所有模型而不是主数据库连接指定的 db,如何我可以做这个?
php - Yii2 从模型中访问模块实例
我想知道是否有办法从模型访问模块实例。在我的模块配置中,我需要在模型类中调用一些组件,模型仅在我的模块中定义。我知道该方法Yii::$app->getModule('my-module')
,但这意味着每次都必须使用相同的名称定义模块,从控制器的模块中我可以访问$this->module->component-name
,模型中的类似内容?
testing - Yii2 测试:如何与主应用程序测试一起运行模块测试?
我想运行我的主要应用程序 Codeception 测试并让它自动通过通过 composer 安装的 3rd 方模块(假设它们带有自己的 Codeception 配置)提供的测试(这意味着它们位于vendor/
文件夹中)。
我不知道如何做到这一点。我是否需要提供某种 Codeception 运行参数?我必须修改引导文件吗?Codeception 甚至支持这样的东西吗?
yii2 - Yii2 - 使用高级模板创建模块
我知道构建一个模块就像一个迷你 Yii2 应用程序。我正在尝试构建一个博客模块以在不同的项目中重用。
我想创建一个包含后端和前端的模块,然后能够访问每一侧。
在 Yii2 basic 中没有后端和前端,所以我在应用根目录下创建了“modules”文件夹。在 Yii2 的情况下,我们有后端和前端。
所有教程仅显示为后端或前端创建模块。
我正在共同创建一个文件夹“模块”。在模块内部,我正在创建一个具有以下结构的文件夹“blog”:
创建和配置模块的正确方法是什么?
更新 我从@samdark 找到了这篇文章,他给出了一个配置示例,我根据我的结构显示配置:
yii2 - Yii2:如何创建没有控制器名称的模块命令?
有一个类似的问题询问“如何在模块中创建控制台命令? ”其中包含有关如何将命令添加到 Yii2 模块的一个很好的答案。
但是,生成的命令必须采用以下格式:
./yii module_name/command/sub-command
其中command
与控制台Controller名称相对应,sub-command
并与其Action名称相对应。
我们如何省略控制器名称并让它仅列出操作名称,以便我们的命令采用以下格式:
./yii module_name/command