iT邦幫忙

0

請問以 PHP 設計網站,MVC 中的 controller 是指物件還是頁面?

請問以 PHP 設計網站,MVC 中的 controller 是指物件還是頁面?
目前查到的 MVC 各部分的責任是:
models 處理數據
views 呈現數據
controllers 流程控制
想請問是以下哪個方式

方式一
https://ithelp.ithome.com.tw/upload/images/20190207/200760583wvYkigmKP.jpg


方式二
https://ithelp.ithome.com.tw/upload/images/20190207/20076058MJGCEicfQg.jpg



補充一個例子,把我的疑問說明的詳細一點:
導覽列有三個連結,

<a href='update.php?sheet=brand'>修改品牌</a>
<a href='update.php?sheet=product'>修改產品</a>
<a href='update.php?sheet=customer'>修改客戶</a>

當使用者點擊 "品牌" 項目時,跳到 update.php?sheet=brand,
我想問此時 update.php 內的程式碼應該是上面二個方式之中的哪一個?

方式一是在 update.php 內產生 controller 類別的實例,
用 controller::prepareData() 方法判斷流程分支,
此 prepareData() 方法內每個分支都使用 model 的方法與數據庫互動。
取得數據後,用 controller::makeData() 方法製作表單,
此 makeData() 方法內是轉給 view 來製作表單。
最後用 controller::display() 方法顯示表單在 update.php 上給使用者

方式二沒有 controller 類別
update.php 就是一個 controller,
此頁面直接寫判斷流程、
直接使用 model 的方法與數據庫互動,
直接使用 view 的方法來製作表單。
直接顯示表單。

想請問哪個方式才是正確的?

看更多先前的討論...收起先前的討論...
weiclin iT邦高手 4 級 ‧ 2019-02-07 14:38:00 檢舉
物件, 但是也沒規定一定要用物件去寫, 重點是 view 與 model 要拆分開來, 由 controller 統合, 有沒有用物件倒是其次
samjam iT邦新手 3 級 ‧ 2019-02-07 22:54:24 檢舉
您好,我在上面發問內容中有補充一個例子,
把我的疑問說明的詳細一點,
請問那二個方式哪個才是正確的?
謝謝您!
weiclin iT邦高手 4 級 ‧ 2019-02-08 00:39:40 檢舉
兩者皆正確, MVC 它只是一個概念, 實做的方法可以有很多種
事實上現在流行的方式還會有一個 FrontController 做單一進入點
但是需要多複雜的設計取決於你能從這個設計得到的好處是否大於壞處
你看看 wiki 給的 js 範例多陽春: https://zh.wikipedia.org/wiki/MVC
按照現今的架構。
create、update、delete以及record(result)都是各自獨立對應函式了。
不會去用$_GET或是$_POST來判斷。
因為$_POST的url仍然有可能帶入了$_GET參數。
$_POST也有可能根本接不到東西(例如:application/json)
然後我只有一件事可以說:
無法理解的東西,轉不過思維的東西。
不應當需求他人的解釋。
這話講的或許有點硬。
可是要是能反過來靜下來思考。
是不是自己在「基本層面」的功夫上少掉了什麼東西。
有時候,當你能全然思考到這個問題的癥結點時。
你會一瞬間明白很多道理。
不要執著在一個卡住的點。那只會矇住你的眼睛來做事。
真的還是理解不能時。
我會建議不妨「不要從你慣用的語言」來看這件事。
換個心情學一下別的語言……也許你會更清楚MVC架構究竟是怎麼一回事。
甲土豆 iT邦新手 5 級 ‧ 2019-02-11 10:31:13 檢舉
你可以先去實作PHP其中一種的框架,大概就可以知道MVC架構了
samjam iT邦新手 3 級 ‧ 2019-02-11 18:09:29 檢舉
請問這篇文章中
https://ithelp.ithome.com.tw/questions/10187827
我看到兩位回答者,
對於 View/Controller 的定義好像不一樣:
weiclin 大大的範例 get_input() 是歸類為 View,
froce 大大定義的 Controller 是 "負責處理前端瀏覽器輸入的資料",
如果照 froce 大大的定義,那 get_input() 是否該歸類為 Controller 呢?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
bizpro
iT邦大師 1 級 ‧ 2019-02-08 10:11:39
最佳解答

MVC的核心觀念是低耦合. 低耦合的意義是當要改變什麼, 才做什麼. 聽起來像是沒說什麼?
軟體是工程, 包含生產端到消費端, 有各種管理資訊的方式, 用MVC來進行管理是其中一種:

  1. Model是資訊的生產鏈, 專門負責資訊的存取(access).
  2. Controller是資訊的物流鏈, 專門負責資訊的傳送(transmission)與資訊流(routing).
  3. View是資訊的消費鏈, 專門負責資訊的使用(view)與擷取(acquirement).

model和controller都是閘道gateway或路由(router), 形成資訊的供應鏈, 這是分工(division of labor)和去耦合(decoupling)的觀念. 因此, MVC更是一種哲學問題: 怎麼分怎麼合.

依據第一張圖, 您的第一個案例是高度耦合的做法, 但依據您提供的第一個案例, 和第二個案例又一樣, 所以不知內容是什麼, 就href來說明:
'update.php?sheet=brand'
如果update.php是您的資訊路由, 的確是controller. 如果sheet是資訊閘道, 那便是modeler.

但您有在update.php和sheet中進行分工和去耦合嗎? 如果有, 那是真實的MVC.

samjam iT邦新手 3 級 ‧ 2019-02-12 07:13:06 檢舉

您好,這句"第一個案例是高度耦合的做法"不太了解,
請問耦合的地方是哪邊,謝謝您

bizpro iT邦大師 1 級 ‧ 2019-02-14 00:15:04 檢舉

很抱歉, 我只是看圖說故事, update.php似乎Model和View的工作都有.

samjam iT邦新手 3 級 ‧ 2019-02-15 22:50:11 檢舉

我了解您的意思了,謝謝

0
echochio
iT邦高手 1 級 ‧ 2019-02-07 10:22:49
  不知您對頁面及物件的認知為何?

 基本上只要是給前端看的頁面都是views, 所以使用者輸入都是views,輸出結果頁面也是 views

 control 接收傳送 views 的資訊,做邏輯運算及呼叫model做讀出存入 data

  model 專注於資料存放,回應control 的DATA

  我不知您的頁面定義,就表面文字意義應該是指給人看的頁面吧 這樣就是 views

關於物件,一般是指一個套件集合,例如一般轎車都有輪胎,一顆輪胎就是一個物件,四個輪胎也就變成轎車基本配備(當然五顆六,,,都可能),引擎是個物件,雖然一台車正常只有一個引擎,,,,

      那程式中將重複的變成一個物件,沒重複的也可成為物件,,,這部分自己Google 一下不想長篇大論了

   所以重複的部分做出來成為個物件(沒重複的也可成為物件) ,所以用在 views, control , model 都有可能
 
samjam iT邦新手 3 級 ‧ 2019-02-07 22:54:36 檢舉

您好,我在上面發問內容中有補充一個例子,
把我的疑問說明的詳細一點,
請問那二個方式哪個才是正確的?
謝謝您!

echochio iT邦高手 1 級 ‧ 2019-02-09 01:41:00 檢舉

好吧選擇題 ....
方式一修改一下 ....
PrepareData()
Display()
ShowData()

都是 View

samjam iT邦新手 3 級 ‧ 2019-02-15 22:38:55 檢舉

了解 謝謝您的回答

1
淺水員
iT邦大師 6 級 ‧ 2019-02-07 23:30:47

我的觀念:

  1. MCV 與是否使用 OOP 無關,那只是一種架構的思維,目的離不開易於維護與重用程式碼,同時有助於團隊的合作開發。
  2. 大多數的 php framework 並非真正完全符合 mvc 定義。甚至有些並不是 mvc 儘管它有 controller 跟 view
  3. 程式設計師之間對於 mvc 的劃分其實各有差異。
  4. MVC 是為了幫助解決問題,如果因為它讓問題更複雜,那麼就本末倒置了。這也是為什麼很多框架雖然有 mvc 的影子,卻不完全是 mvc 。

所以最重要的是問自己 mvc 為自己帶來了什麼,到底如何設計較為合理。

也許可以試試看同一個網站,分別:不使用框架以及選2個框架各寫一次,應該就會有感覺了。

weiclin iT邦高手 4 級 ‧ 2019-02-08 00:34:56 檢舉

/images/emoticon/emoticon12.gif

samjam iT邦新手 3 級 ‧ 2019-02-15 22:41:38 檢舉

好 我來試試看 謝謝您

我要發表回答

立即登入回答