我正在开发一个使用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),但这将导致无限重定向循环,所以我需要想出一个更好的方法来解决这个问题。
总而言之,这个设置是否有意义?!感谢任何反馈。
答案 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,您可以轻松地进行身份验证而不会出现任何麻烦,并将其全部分开。