1

我想为我的模块使用特定的文件夹名称,但我真的不希望它的名称显示给最终用户(即:在 URL 中)。我试图设置类名,但它告诉我当它不是它应该是什么时它不存在。请注意:示例中的名称已更改,但它明白了要点。

在我的配置中:

'modules'=>array(
    'cart'
),

在 /protected/modules 我有一个文件夹ezcart。这是 Gii 创建的一个模块。我可以确认,当我使用 Gii 创建“购物车”时,它按预期工作。

问题是,从源代码的角度来看,我希望文件夹ezcart的名称保持不变。是我的包名,我会放到GitHub上分享,以后自己用。所以文件中的任何人都知道什么是什么,就像我们在“供应商”等中保持相同的名称一样。

因此,如果我在我的 config.php 中使用 Gii 创建ezcart,我如何告诉 Yii 使用不同的目录名称。例如,我想这样做:

'modules'=>array(
    'cart'=>array(
        'class'=>'application.modules.ezcart'
    )
),

但是,它告诉我找不到ezcart。如何让 Yii 接受这种命名差异?

4

2 回答 2

0

解决了!!!

似乎当您尝试在模块的 URL 中使用不同的名称时,Yii 失去了它的大脑。我试图传递 $defaultController 和 $defaultAction,以及其他大约 10 个东西。我不知道如何覆盖 Yii 在我的模块“ezpaypal”上设置的映射,因此我可以将其 URL 更改为“billing”,但仍指向“/modules/ezpaypal”。

首先,使用 Gii 创建一个模块。我将我的命名为“ezpaypal”。轰隆隆,一切都生成了。

将您的模块名称添加到 config.php:

'modules'=>array(
    'ezpaypal'
),

问题是,我不想在 URL 中看到“ezpaypal”。我希望它是可变的,所以它可以是“/billing”或“/checkout”。所以我需要模块保持命名为“ezpaypal”。我尝试并尝试了规则,并遇到了很多问题。

似乎 Yii 为“ezpaypal”创建了根别名,因为它是我加载的模块。如果您像往常一样使用它,它确实可以正常工作。它知道要使用的控制器,一切。

当你使用 urlManager 规则将 "billing" 映射到 "ezpaypal" 以更改 URL 中的名称时,Yii 不再知道使用哪个默认控制器。它也不知道要采取什么默认操作,例如 /controller/3 它不知道要执行 /controller/view/3。Yii刚刚脑死亡。

更好的解决方案是,如果 Yii 确实有一种“隐藏”或不那么为人所知的方式来处理这个问题?我不确定 Yii 框架在哪里解析配置并加载模块。也许在那里我可以找到一个函数或要设置的变量,无需冗长的 url 管理器规则即可解决此问题。它可以正确处理“ezpaypal”的模块 url 规则,而无需向 urlmanager 添加任何内容......

不过,一个简单的解决方法是编写您的 URL 管理器规则来处理每个可能的组合。也许有人可以把它清理成更少的行?

'rules'=>array(
            // EZPayPal Friendly URL Support - DO NOT TOUCH!
            '<module:(billing)>'=>'ezpaypal',
            '<module:(billing)>/index'=>'ezpaypal/default/index',
            '<module:(billing)>/<controller:\w+>'=>'ezpaypal/<controller>',
            '<module:(billing)>/<controller:\w+>/<id:\d+>'=>'ezpaypal/<controller>/view',
            '<module:(billing)>/<controller:\w+>/<action:\w+>/<id:\d+>'=>'ezpaypal/<controller>/<action>',
            '<module:(billing)>/<controller:\w+>/<action:\w+>'=>'ezpaypal/<controller>/<action>',
),

工作:)

如果有人在做同样的事情,为您的模块使用不同的 URL 路径,只需将“billing”更改为 URL 中您想要的名称,将“ezpaypal”更改为模块目录的实际名称。

PS:上面的规则可以简化吗?我不知道。看来这是一个完美的组合。如果我删除一个,那条路线就会中断。此外,我仍在寻找一种更简单的方法,以便我们可以在没有 urlmanager 的情况下覆盖它。

于 2015-02-10T20:48:19.643 回答
0

你应该为此使用 URL 路由.. 在你的 config/main.php 添加这样的规则像这样

...
'components' => array(
    ...
 'urlManager'=>array(
     'rules'=>array(
       'mynewname/<controller>/<action>' =>'ezcart/<controller>/<action>'
      )
  )
)

有关一些示例,请参阅指南中的URL 管理以及使用路由可以实现的一切

于 2015-02-10T06:30:10.487 回答