【发布时间】:2018-01-22 12:22:25
【问题描述】:
我有各种类,它们的方法具有相同的代码。维护观点是一种非常糟糕的做法。
这是此类的一个示例:
类 accountController:
<?php
namespace controller\admin;
class accountController extends \controller\baseController
{
private $table = 'account';
public function itemslist()
{
list($res, $totalcount) = $this->getResultAndCount();
return $this->twig->render('/admin/accounts.html.twig');
}
.
... other methods
.
private function getResultAndCount()
{
$sql = 'SELECT * FROM ' . $this->table;
$count = $this->pdo->rowCount();
$rows = $this->pdo->resultset();
return array($rows, $count);
}
}
类用户控制器:
<?php
namespace controller\admin;
class userController extends \controller\baseController
{
private $table = 'user';
public function itemslist()
{
list($res, $totalcount) = $this->getResultAndCount();
return $this->twig->render('/admin/users.html.twig');
}
.
... other methods
.
private function getResultAndCount()
{
$sql = 'SELECT * FROM ' . $this->table;
$count = $this->pdo->rowCount();
$rows = $this->pdo->resultset();
return array($rows, $count);
}
}
如图所示,具有相同代码的方法 getResultAndCount 是重复的。我不是 OOP 方面的专家,我一直在寻找在某处只有一个代码并在 itemslistAction() 方法中引用它的方法。
我已经看到了执行此操作的方法,例如使用此方法创建另一个类并在父类中调用它、接口、方法……但我很困惑,我想知道实现它的最佳方法是什么以及如何。
【问题讨论】:
-
两个控制器都扩展
\controller\baseController,你为什么不把这个方法放在\controller\baseController? -
您已经有很好的建议来快速解决您的问题,但我要补充一点,您的控制器可能有太多责任。与数据库交互应该由模型(或实体,如果你使用 ORM)处理,而控制器应该处理整个控制流。
-
我同意你的看法。我是 MVC 的新手,如果你能提出任何建议,我今天会学到一些东西,这对社区也有帮助。