帮助逻辑组织控制器

时间:2010-03-30 12:56:50

标签: php model-view-controller oop

我正在开发一个使用MVC结构开发的网站。我的模型将代表网站中的所有数据,但我正在努力决定一个好的控制器结构。该网站将允许用户登录/注册并查看多个页面上的个人数据,但仍然可以访问公共页面,例如常见问题解答,联系页面等。

这就是我现在所拥有的......

模板控制器,用于处理主模板显示。无论您是否登录,网站的基本模板都将保持不变。

主网站控制器,它扩展模板控制器并处理基本身份验证。如果用户已登录,则从构造函数调用User :: control_panel()方法,这将构建将在整个经过身份验证的会话中出现的控制面板。如果用户未登录,则加载不同的视图而不是控制面板,例如使用登录表单。所有受保护/公共页面相关的控制器都将扩展网站控制器。

用户主页有许多我想要显示的小部件,我正在通过扩展网站控制器的Home Controller进行操作。该控制器通过以下静态调用生成这些小部件:

$this->template->content->featured_pet = Pet::featured(); 
$this->template->content->popular_names = Pet::most_popular(); 
$this->template->content->owner_map = User::generate_map(); 
$this->template->content->news = News::snippet(); 

我认为我不确定的第一件事是,如果对控制器的上述静态调用(例如Pet和User)可以保持静态 - 这些静态方法将返回加载到主模板中的视图。这是我过去做过的事情,但我很想知道这是否是一种明智的做法。登录用户的其他受保护页面与家庭控制器类似。

静态页面将由页面控制器处理,页面控制器也将扩展网站控制器,以便它知道用户控制面板或登录表单是否应显示在模板的左侧。仅受保护成员的页面不会路由到页面控制器,此控制器仅处理公共可用页面。

目前我遇到的一个问题是,如果公共页面和受保护页面都扩展了网站控制器,我该如何避免无限循环 - 例如,想法是网站控制器应该处理身份验证然后重定向到请求控制器(URL),但这将导致无限重定向循环,所以我需要想出一个更好的方法来解决这个问题。

总而言之,这个设置是否有意义?!感谢任何反馈。

1 个答案:

答案 0 :(得分:1)

我的控制器布局如下:

/**
* Global controller
*/

class MY_Controller extends Controller {

 function __construct() {
  parent::__construct();

  // Load templates, modules etc
 }
}


/**
* Admin controller
*/


class Admin_Controller extends MY_Controller {

 function __construct() {
  parent::__construct();

  // Check admin is logged in
 }
}

/**
* User controller
*/

class User_Controller extends MY_Controller {

 function __construct() {
  parent::__construct();

  // Check user is logged in

 }
}

任何用户页面都会扩展User_Controller,管理页面会以这种方式扩展Admin_Controller,您可以轻松地进行身份验证而不会出现任何麻烦,并将其全部分开。