这是我不明白的事情。我根据视频教程构建了一个非常酷的路由器和MCV系统,效果很好!有一件事我有点困惑。它不是特定于代码的任何内容,而是更多关于逻辑的内容。简而言之:
该模型类是静态的,不会被实例化。所以,让我们说我想创建一个新成员。从控制器类内部我会得到类似的东西:
Model::createMember($this->first_name, $this->last_name, $this->screen_name, $this->created_date);
然后,当然,在模型中,我将有一个方法在底层数据库中创建一个类似于以下内容的成员:
public function createMember($first_name, $last_name, $screen_name, $created_date) { blah blah blah }
这一切都很好,花花公子,但在我看来,我应该能够从模型中直接访问控制器对象的属性,并减轻必须传递所有这些参数。访问对象的属性对我来说似乎更多OOP,因此这就是我想要做的事情。
问题是,我无法做到
$controller_object = new Controller();
从模型类中引用控制器并获取其属性的访问权限。
控制器对象已经存在于路由器中,因此创建一个新对象对我没有好处。我需要能够创建一个引用该现有对象的变量。
现在我有它工作,但我基本上使控制器对象的属性全局,然后可以使用全局关键字直接从模型类访问它们,但我不是真的想要这样做方式。
我的想法是改进系统只是一个坏的,或者有没有办法引用现有的控制器对象,所以我可以直接访问它的公共属性,而不必将参数从控制器传递给模型?
答案 0 :(得分:0)
你的问题的直接答案是使用$this
,因为它实际上代表了你在控制器方法内的实例化控制器,所以而不是
Model::createMember($this->first_name, $this->last_name, $this->screen_name, $this->created_date);
你可以这样做
Model::createMember($this);
然后在模型中,您可以访问控制器对象。
实际上,我不这样做,因为模型实际上不应该依赖于控制器。
控制器职责是解析传入的请求数据,创建模型并将请求数据传递到模型中。
实际上不需要在控制器中使用first_name
,last_name
等属性。控制器可以只有一些带有传入数据的$data
数组,它不应该关心这些数据的实际内容。
模型职责是验证数据(这也可以是一个单独的对象)并执行数据库操作或与数据相关的任何其他业务逻辑操作。
我也会避免使用模型的静态方法。而不是
Model::createMember(...parameters...)
我愿意
// $data is the request data parsed by controller
// controller knows how / where to get the data (from GET, POST, etc)
// but it doesn't care about the actual content
$model = Model($data)
...
if ($model->validate()) {
$model->save()
// show success message to the user
} else {
// show error message to the user
}