簡體   English   中英

CakePHP模型實際上是控制器嗎?

[英]Are CakePHP models actually controllers?

我不是MVC架構的專家,但是我一直在某些JAVA項目中使用提到的架構。 現在,我進入了PHP MVC框架(例如CakePHP和Laravel ),並決定選擇CakePHP

更深入地講,我看到CakePHP中的模型負責諸如查詢之類的操作,而其他一些則負責數據本身在arrays管理(即$ user ['User'] ['first_name'])。

我所熟悉的方式是, Model類僅用於存儲模型數據,也就是說,數組在CakePHP中的作用

public Class User {
    private String firstName;
    public void setFirstName(String firstName) { this.firstName = firstName; }
    public String getFirstName() { return this.firstName; }
}

Controller類負責查詢和其他模型構建操作,也就是說, CakePHP中的模型做什么:

public Class UserManager {
    public User getById(int id) { /* */ }
    public boolean save(User user) { /*  */ }
}

那么, CakePHP和類似的MVC Frameworks ,Models實際上是控制器嗎? 如果可以,這是否應該是一種新型的體系結構,例如Router-View-Controller,因為控制器類實際上是路由請求的?

我認為官方文檔已經很好地說明了這一點:

模型是位於應用程序中業務層的類。 這意味着他們應該負責管理與您的數據有關的幾乎所有事情,其有效性,相互作用以及您工作領域中信息工作流程的演變。

通常,模型類代表數據,並在CakePHP應用程序中用於數據訪問,更具體地說,它們代表數據庫表,但不僅限於此,還可以用於訪問任何處理數據的內容,例如文件,外部Web服務,iCal事件,或CSV文件中的行。

實際上,基本上認為CakePHP 2.0中的模型可以執行任何類型的數據操作。

  • 是否需要將數組轉換為CSV字符串? 模型工作。
  • 需要驗證上傳的圖片嗎? 模型工作。
  • 需要保存上傳的文件嗎? 模型工作。
  • 需要以某種方式操縱您的POST數據嗎? 模型工作。
  • ...

上面的任務都不認為是在控制器中完成的,我們要尊重關注點分離(SoC)。 控制器僅管理請求,但處理數據,這就是模型工作。 此外,模型比控制器更容易進行單元測試,而且您可以在shell中共享它們,而對於沒有違反MVC的控制器,則無法做到這一點:這是一個示例:

您應該始終保持模型胖而使控制器變薄:

/** CONTROLLER **/

if ($this->request->is('post')) {
    if ($this->Model->doSomething($this->request->data)) {
        $this->Session->setFlash(__('Something was done right!'));
        $this->redirect(['view' => $this->Model->data['Model']['id']); 
    }
}

/** MODEL **/

public function doSomething($data) {
   $this->create();
   $result = $this->save($data);
   if ($result) {
       $result[$this->alias][$this->primaryKey] = $this->getLastInsertId();
       $this->data = $result;
       return true;
   }
   return false;
}

不,模型不是控制器,不在任何php框架中。

模型僅顯示您的數據集合,而另一方面,控制器則控制模型和視圖之間的流程。 例如,控制器調用您的模型以獲取數據,然后以某種方式處理該數據並將其推送到視圖,因此您可以在那里拾取它並對其進行處理。

您願意告訴您為什么選擇cakePHP嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM