管理一个应用程序的多个专用版本的最佳实践

时间:2008-10-29 01:45:25

标签: php oop inheritance directory-structure

我有一个有许多面孔的Web应用程序,到目前为止,我已经通过创建主题实现了这一点。主题是一组与公共后端一起使用的html,css和图像。

事情就像这样:

code/
themes/theme1
themes/theme2

Web应用程序的每个实例都有一个配置文件,指出应该使用哪个主题。例如:

theme="theme1"

现在新的业务规则要求我通过简单地更改html / css / images并需要更改后端来对某些无法实现的主题进行更改。在某些情况下,这些更改需要应用于一组主题。

我想知道如何最好地将它放在磁盘上,以及如何在代码中处理它。我相信其他人肯定会反对这一点。

一个想法是:

code/common
code/theme1
code/theme2
themes/theme1
themes/theme2

然后让我的公共代码设置为include_path,以便首先搜索code/theme1,然后搜索code/common

然后,如果我想专门针对LogoutPagetheme2课程,我只需将页面从code/common复制到code/theme2下的相同路径即可专业版。

这个想法的一个问题是,将有多个具有相同名称的类。虽然理论上它们永远不会包含在同一个执行中,但我无法扩展原始基类。

那么如果我要为基类创建一个唯一的名称呢?例如Theme1LogoutPage extends LogoutPage。我可以预见的一个问题是,当一些公共代码(比如Dispatcher)引用LogoutPage时。我可以为调度程序添加条件,但我想知道是否有更透明的方法来处理它?<​​/ p>

我能想到的另一个选择是为每个主题维护单独的分支,但我认为这可能是很多工作。

最后要考虑的是功能可能源于一个主题,然后需要合并到公共代码库中。

任何输入都非常感谢。如果它有任何区别,那就是LAMP环境。

6 个答案:

答案 0 :(得分:1)

我没有具体的建议。但是,我强烈建议 NOT 采取快捷方式...使用您可以轻松添加第三个主题或明年更改内容的解决方案。
复制是可维护性的敌人。

答案 1 :(得分:1)

我会调查使用策略模式作为在不同版本的网站中实现不同功能的方法。让工厂接收您的配置并根据它提供适当的代码策略。每个策略都可以实现一些通用接口,以便它们可以从调用类的角度进行交换。这将隔离您的更改以实现Factory类,Configuration类以及您需要实现以进行更改的任何新策略类的新策略。您可以对不同版本之间需要区别的任何用户控件执行相同(或类似)操作。

我将使用伪代码进行说明(可能看起来像C#一样可疑)

public interface ILogoutStrategy
{
   void Logout();
}

public abstract class AbstractLogoutStrategy : ILogoutStrategy
{
   public virtual void Logout()
   {
      // kill the sesssion
   }
}

public class SingleSiteLogoutStrategy : AbstractLogoutStrategy
{
   public void Logout()
   {
      base.Logout();
      // redirect somewhere
   }
}

public class CentralAuthenticationSystemLogoutStrategy : AbstractLogoutStrategy
{
   public void Logout()
   {
      base.Logout();
      // send a logout request to the CAS
      // redirect somewhere
   }
}

public static class StrategyFactory
{
   public ILogoutStrategy GetLogoutStrategy(Configuration config)
   {
      switch (config.Mode)
      {
         case Mode.CAS:
            return new CentralAuthenticationSystemLogoutStrategy();
            break;
         default:
         case Mode.SingleSite:
           return new SingleSiteLogoutStrategy();
           break;

      }
   }
}

使用示例:

ILogoutStrategy logoutStrategy = StrategyFactory.GetLogoutStrategy( config );
logoutStrategy.Logout();

答案 2 :(得分:0)

您使用的是母版页吗?如果您需要不同的布局和UI内容,您可以为每个实例设置一组不同的母版页。如果您需要自定义行为,那么您可能需要查看依赖注入。 Spring.NET等。

答案 3 :(得分:0)

您需要的是模板。

因此您可以将代码与演示文稿分开。

我强烈推荐smarty模板。还有PEAR template_it。

http://www.smarty.net/

这也使您的代码更易于维护。目的是在你的PHP中没有html,并且在你的html中没有php。

然后您需要做的就是更改用于每个主题的html模板。或模板文件夹。

答案 4 :(得分:0)

你可以:     /普通/代码

和:     /网站名称/代码

/ common / code中的所有文件都是抽象类。 对于/ common / code中的每个文件,只需在/ sitename / code中创建一个相应的非抽象类文件,该文件来自/ common / code中的抽象类INHERITS。

这样您只需要在/ sitename / code中实现CHANGES 其他所有内容都是仅存在于/ common / code

中的核心功能

这里要做的重点是确保您只将 public 方法添加到抽象类中。这样,所有站点都可以使用这些方法,并且可以相同地处理/处理来自所有站点的类。

答案 5 :(得分:0)

我愿意:

[主题名称] / [子文件夹] 缺省的/共同 默认/普通/ HTML 默认/普通/ CSS 红/代码 红/共同 红/普通/ HTML 红/普通/ CSS 红/代码 绿色/共同 绿/普通/ HTML

因此,如果代码或任何其他组件不存在,它将回退到默认值。

但实际上我会在svn中分支网站,所以常见的代码如果它发展我可以合并它等等。请参阅Subversion:http://subversion.tigris.org/