在多站点应用程序中开发Web页面

时间:2011-10-07 21:17:49

标签: php model-view-controller templates kohana

我正在使用其模板系统在Kohana开发多个网站,以便一个代码库使用相同的后端数据库运行多个网站。我开始在视图中看到很多if语句,如果该站点执行此操作,如果该站点执行此操作。它开始看起来非MVC或面向对象。在决定将视图拆分为单独的部分视图时,其他开发人员是否有他们遵循的规则?我希望尽可能多地重用代码,但不要在每个视图中使用if语句。任何参考也会很棒。

3 个答案:

答案 0 :(得分:0)

如果您正在使用Kohana,您应该使用模块来处理您不希望为每个应用程序复制的内容。然后,您可以使用扩展类或配置文件中的特定设置保留应用程序中的细节。

http://kohanaframework.org/3.2/guide/kohana/modules

许多if语句主要表明您需要进行重构。允许加载不同站点的大型级联if语句是一种不好的做法,因为当您需要进行简单的添加或更改时,文件tightly coupled会导致编辑多个文件。此外,如果每个站点需要在if语句中加载不同的依赖项或设置或其他任何内容,它最终会变得丑陋。

很难说在不看代码的情况下需要更改的内容,但请尝试查看factoryabstract factory设计模式等设计模式来创建网站对象。

使用PHP处理模式和最佳实践主题的好书是PHP 5:Matt Zandstra的对象,模式和实践:http://www.amazon.com/PHP-5-Objects-Patterns-Practice/dp/1590593804。一本非常好的书。

答案 1 :(得分:0)

我遇到了类似的问题,为了保持视图的美观和整洁,我将视图类扩展为主题类。我会给工厂方法两个(或更多)视图,即Theme :: factory(array('site1 / home','default / home'),$ data) - > bind(...);如果存在主题视图,它将使用它,否则只提供默认值。这样,我或其他不太称职的人可以轻易地覆盖显示结构和查看行为。

该课程看起来像这样

class Theme extends View {

public static function factory($pages = NULL, array $data = NULL){
  if (is_string($pages)) {
    $pages=array($pages);
  } 
  if (!is_array($pages)) {
    $pages=array(0=>null);
  }


foreach ($pages as $page){
  if ((Kohana::find_file('views', 'themes/'.$page)) !== FALSE){
    return new View('themes/'.$page,$data);
  }
}

throw new Kohana_View_Exception("None of the requested views ':file' could not be found.", array(
            ':file' => join($pages,"' or '"),
  ));
} 
}

答案 2 :(得分:0)

你真的想要ViewModels,只是你不知道如何命名它们。小鸟一直在推文说它会在Kohana 3.3中,但除非你有一年左右的时间等待,否则我建议你尝试View-Model module by Zombor或远离Kohana的模板系统,而​​不是KOstache (it's Mustache for Kohana) < / p>

如果出于任何原因想要坚持使用当前的代码库,我会将视图分成几个较小的可互换部分并在必要时加载它们(echo View :: Factory(($ something =='one'? 'view_one':'view_two'))或自定义书面助手在这里会是一个不错的玩具)