PHP MVC - 我的控制器是不是太胖了?
PHP MVC - Is my controller too fat?
我认为我在我的控制器中放置了太多本应进入模型的代码。
这是我的控制器的一部分,我不会粘贴所有内容,因为有很多代码。
public function ajaxUsers() {
if($_GET["action"] == "listUsers") {
if(!isset($_POST["search"])) {
$this->_data['Records'] = $this->_model->getUsers();
$this->_data['Result'] = "OK";
$this->_data['TotalRecordCount'] = $this->_model->countUsers();
}
else {
foreach($_POST['fields'][0] as $key => $post) {
if ($post != "" && $key != "reg_date") {
$searchTerms = explode(' ', $post);
foreach ($searchTerms as $term) {
$term = trim($term);
if (!empty($term)) {
$like[] = $key." LIKE '%".trim($term, '\'')."%'";
}
}
}
else if ($post != "" && $key == "reg_date") {
foreach ($post[0] as $key2 => $date) {
$datetofrom = strtotime($date);
$datetofrom = date('Y-m-d', $datetofrom);
if ($date != "" && $key2 == "datefrom") {
$like[] = "DATE_FORMAT(".$key.", '%Y-%m-%d') >= '".$datetofrom."'";
}
if ($date != "" && $key2 == "dateto") {
$like[] = "DATE_FORMAT(".$key.", '%Y-%m-%d') <= '".$datetofrom."'";
}
}
}
}
($like) ? $where_clause = "WHERE ". implode(' AND ', $like) : $where_clause = "";
$this->_data['Records'] = $this->_model->filterUsers($where_clause);
$this->_data['Result'] = "OK";
$this->_data['TotalRecordCount'] = $this->_model->countfilterUsers($where_clause);
}
echo json_encode ($this->_data);
}
}
我的模型主要是数据库查询:
public function getUsers() {
$data = $this->_db->select("SELECT * FROM ".PREFIX."users" . $this->_sort);
return $data;
}
public function countUsers() {
$data = $this->_db->select("SELECT count(*) as id FROM ".PREFIX."users");
return $data[0]->id;
}
public function filterUsers($like_clause) {
$data = $this->_db->select("SELECT * FROM ".PREFIX."users " .$like_clause. $this->_sort);
return $data;
}
public function countFilterUsers($like_clause) {
$data = $this->_db->select("SELECT count(*) as id FROM ".PREFIX."users ".$like_clause);
return $data[0]->id;
}
我应该移动模型中的 foreach 循环吗?
PHP MVC - Is my controller too fat?
是的,特别是因为它包含业务逻辑,因此没有关注点分离。原因是因为您没有正确实施模型。模型由数据映射器和域逻辑处理程序组成。而带来数据映射器和领域对象的东西叫做Services
模型不是 class。调用模型 a class 就像调用 class MyLiskovSubstitionClass {}
。这是数据抽象的概念。模型由服务组成。
要正确实施它,您需要从编写映射器开始:
class UserMapper
{
public function getUsers()
{
$data = $this->_db->select("SELECT * FROM ".PREFIX."users" . $this->_sort);
return $data;
}
// ... The rest what abstracts table access
}
然后你会写一个服务,叫做UserManager
final class UserManager
{
private $userMapper;
public function __construct($userMapper)
{
$this->userMapper = $userMapper;
}
public function search(array $input)
{
$data = array();
if (!isset($input["search"])) {
$data['Records'] = $this->userMapper->getUsers();
$data['Result'] = "OK";
$data['TotalRecordCount'] = $this->userMapper->countUsers();
// Do the rest
}
return $data;
}
}
最后:
public function ajaxUsers()
{
if ($_GET["action"] == "listUsers") {
$result = $this->userManager->search($_POST);
die(jscon_encode($result));
}
}
我认为我在我的控制器中放置了太多本应进入模型的代码。
这是我的控制器的一部分,我不会粘贴所有内容,因为有很多代码。
public function ajaxUsers() {
if($_GET["action"] == "listUsers") {
if(!isset($_POST["search"])) {
$this->_data['Records'] = $this->_model->getUsers();
$this->_data['Result'] = "OK";
$this->_data['TotalRecordCount'] = $this->_model->countUsers();
}
else {
foreach($_POST['fields'][0] as $key => $post) {
if ($post != "" && $key != "reg_date") {
$searchTerms = explode(' ', $post);
foreach ($searchTerms as $term) {
$term = trim($term);
if (!empty($term)) {
$like[] = $key." LIKE '%".trim($term, '\'')."%'";
}
}
}
else if ($post != "" && $key == "reg_date") {
foreach ($post[0] as $key2 => $date) {
$datetofrom = strtotime($date);
$datetofrom = date('Y-m-d', $datetofrom);
if ($date != "" && $key2 == "datefrom") {
$like[] = "DATE_FORMAT(".$key.", '%Y-%m-%d') >= '".$datetofrom."'";
}
if ($date != "" && $key2 == "dateto") {
$like[] = "DATE_FORMAT(".$key.", '%Y-%m-%d') <= '".$datetofrom."'";
}
}
}
}
($like) ? $where_clause = "WHERE ". implode(' AND ', $like) : $where_clause = "";
$this->_data['Records'] = $this->_model->filterUsers($where_clause);
$this->_data['Result'] = "OK";
$this->_data['TotalRecordCount'] = $this->_model->countfilterUsers($where_clause);
}
echo json_encode ($this->_data);
}
}
我的模型主要是数据库查询:
public function getUsers() {
$data = $this->_db->select("SELECT * FROM ".PREFIX."users" . $this->_sort);
return $data;
}
public function countUsers() {
$data = $this->_db->select("SELECT count(*) as id FROM ".PREFIX."users");
return $data[0]->id;
}
public function filterUsers($like_clause) {
$data = $this->_db->select("SELECT * FROM ".PREFIX."users " .$like_clause. $this->_sort);
return $data;
}
public function countFilterUsers($like_clause) {
$data = $this->_db->select("SELECT count(*) as id FROM ".PREFIX."users ".$like_clause);
return $data[0]->id;
}
我应该移动模型中的 foreach 循环吗?
PHP MVC - Is my controller too fat?
是的,特别是因为它包含业务逻辑,因此没有关注点分离。原因是因为您没有正确实施模型。模型由数据映射器和域逻辑处理程序组成。而带来数据映射器和领域对象的东西叫做Services
模型不是 class。调用模型 a class 就像调用 class MyLiskovSubstitionClass {}
。这是数据抽象的概念。模型由服务组成。
要正确实施它,您需要从编写映射器开始:
class UserMapper
{
public function getUsers()
{
$data = $this->_db->select("SELECT * FROM ".PREFIX."users" . $this->_sort);
return $data;
}
// ... The rest what abstracts table access
}
然后你会写一个服务,叫做UserManager
final class UserManager
{
private $userMapper;
public function __construct($userMapper)
{
$this->userMapper = $userMapper;
}
public function search(array $input)
{
$data = array();
if (!isset($input["search"])) {
$data['Records'] = $this->userMapper->getUsers();
$data['Result'] = "OK";
$data['TotalRecordCount'] = $this->userMapper->countUsers();
// Do the rest
}
return $data;
}
}
最后:
public function ajaxUsers()
{
if ($_GET["action"] == "listUsers") {
$result = $this->userManager->search($_POST);
die(jscon_encode($result));
}
}