我正在构建一个轻量级的MVC,主要是为了学习过程,但我希望它最终可以使用。
下面是一个基本控制器可能看起来如何的基本示例/演示,我们假设已经处理了URI并将其路由到此控制器以及这两种方法。
1)我需要从我的Model类中的数据库/缓存/等...获取数据,我只需要帮助我将模型加载到下面的示例控制器中,你可以看到我在下面添加了这个$profileData = $this->model->getProfile($userId)
刚刚组成并且不存在,我怎么能得到这样的东西呢?或者我应该以不同的方式将模型加载到类中?
2)许多页面都需要用户登录该站点。我应该在控制器中处理下面的部分,以检查用户是否已登录,例如,在构建配置文件页面之前,检查用户是否已登录,如果没有,则建立登录页面,并在每个控制器方法中添加这些检查/页?
/**
* Example Controller
*/
class User_Controller extends Core_Controller {
// domain.com/user/id-53463463
function profile($userId)
{
//GET data from a Model
$profileData = $this->model->getProfile($userId);
$this->view->load('userProfile', $profileData);
}
// domain.com/user/friends/
function friends()
{
//GET data from a Model
$friendsData = $this->model->getFriendlist();
$this->view->load('userFriends', $friendsData);
}
}
芯
abstract class Core_Controller {
protected $view;
protected $model;
function __construct(DependencyContainer $dependencyContainer){
$this->view = new Core_View();
//$this->view = $dependencyContainer->get(view);
}
}
答案 0 :(得分:2)
有很多方法可以实现你的目标。
“最简单”可能只是覆盖构造函数并直接实例化模型。
在User_Controller中:
public function __construct(DependencyContainer $dc) {
parent::__construct($dc);
$this->model = new User_Model();
}
我猜你正在寻找一些更自动化的东西。如果您希望Model与控制器名称相同,而不是“_Controller”,只需在构造函数中使用get_class($ this)并使用PHP的字符串函数来解析您想要的内容。一旦你在变量中有了它,就可以使用该变量来实例化模型:
Core_Controller中的:
public function __construct(DependencyContainer $dc) {
$this->view = new Core_View();
// $model_class should be 'User_Model' now
$model_class = str_replace('_Controller', '_Model', get_class($this));
// now instantiate the model
$this->model = new $model_class();
}
我实际上没有使用任何只能有一个模型与每个控制器关联的框架(除了CakePHP可能吗?我不记得了)。使用Symfony,模型和控制器完全分离,因此您可以将任何模型与任何控制器一起使用。您只需根据需要实例化模型。 Symfony使用Doctrine ORM,例如,在控制器动作中,如果你需要一个模型,你会做这样的事情:
$model = Doctrine::getTable('User');
为了促进分离设计并且我承诺,在某些时候在某些控制器中需要多个模型,可能值得考虑更像这样的设计。
2。)至于认证。似乎相当常见的一种方法是使某种设置(无论是在配置文件中还是在成员变量中)说明当前操作是否需要用户进行身份验证。每次动作运行时都会对此进行处理(Yii称这些事物为过滤器)。如果用户需要登录,则会存储他们尝试访问的页面,然后将其重定向到登录页面(您只需要创建一个)。一旦他们正确地进行身份验证,它就会将它们重定向回原来的位置。