2014-03-25 38 views
1

我认为我有一个奇怪/复杂的情况,但我认为我忽视了一些简单的事情。我们正在建立一个Yii应用程序,该应用程序将托管其他人创建的“皮肤”。它基本上是一个大社区,但在许多不同的网站上。一切都将由一个单一的通用核心Yii应用程序处理。许多社区站点的虚拟文档根目录

我们的计划是让这取决于皮肤的主人想要做两个不同的URL配置:

1)whatever.theirsite.com(被设置为CNAME到portal.oursite.com - 为高级用户)

2)portal.oursite.com/theircommunity - 为那些谁只是希望它没有其他配置

在第一种情况下工作,这是很容易挑出SERVER_NAME变量,抬头数据库中正确的主题,并提供正确的主题/社区。我在过去实际上已经完成了这项工作,并且工作正常。但是,我对第二种情况有点遗憾。我仍然可以通过db查找来找出portal.oursite.com/theircommunity提供的主题,但是所有路由都会因为它们的社区不是控制器而被搞砸。它更像是一个虚拟目录,但它的动态。我觉得我缺少一个简单的htaccess或可能的UrlManager规则。

有效例如网址如下:

http://whatever.theirsite.com/mycontroller/myaction 
http://portal.oursite.com/theircommunity/mycontroller/myaction 

或模块:

http://whatever.theirsite.com/mymodule/mycontroller/myaction 
http://portal.oursite.com/theircommunity/mymodule/mycontroller/myaction 

在所有情况下,两对请求的需要去同一个地方。后端处理确保它们看起来不同,但是由相同的代码处理。

有什么建议吗?

编辑: 我想到的一个解决方案,但尚未测试(不知道它是否是个好主意,或者它甚至可以工作)将扩展URL管理器以添加新的路由规则,具体取决于在哪个社区被要求。

例如:

  • 应用程序运行之前,做一个数据库查找,以找出我们 正在使用的主题。

  • 如果主题使用虚拟根目录,则复制所有现有的url管理器规则,但将它们的社区名称附加到它们的前面。

回答

0

是的,我认为你的编辑/ URL管理器设置可能是你最好的选择。

值得一提的是,这些路由规则看起来与模块路由规则类似,因此您可能可以使用应用行为假装载具有适当名称的模块。去年我为客户做了类似的事情;它工作,但很复杂。我建议你开始舒适地写这个系统的单元测试,你会希望他们确保你不会在将来破坏事情:-)

0

有趣的问题!我可能会在这里留下痕迹。但是会有这样的工作吗?

/portal.oursite.com 
    /theircommunity1/index.php 
    /theircommunity2/index.php 

言外之意:创建一个用户特定的webroot子目录。

这意味着用户1将拥有/theircommunity1/index.php条目脚本。用户2将有/theircommunity2/index.php。在进入脚本您可以

  1. 设置用户特定的变量
  2. 包括“次要”入口脚本,可能是Web根目录之外。
+0

我明白你的意思了。如果没有其他选择,这可以工作。我希望有一个更“优雅”的解决方案,不需要创建新的目录。 – Eric

0

我不知道我是否正确理解你的情况。您可以扩展UrlManager并根据站点查找创建一些变量。例如$ _GET ['site'] ='theircommunity';并且可以稍后在应用程序中检查此变量。

0

这实际上结束了一个简单的解决方案,但它花了我一段时间才找到它。这只是扩展CHttpRequest并在init()中为请求设置baseUrl属性的问题。

if (Yii::app()->domainManager->isPortalDomain) { 
    // need to set the document root correctly 
    Yii::app()->request->baseUrl = '/' . Yii::app()->domainManager->domain->name; 
} 

当我这样做,所有的路由工作和URL正确创建。