model-view-controller(mvc)架構可以追溯到smalltalk和xeroxparc。從那時起,就有很多系統描述他們自己的mvc架構。每個系統都略有不同,但是總體的目標都是把資料儲存,業務邏輯和使用者結構彼此分割。
大部分的php mvc架構大致如下
1. url解析,通常叫做front controller
2. 解析後,獲得controller名字和對應的方法(這個過程也被叫做routing)
3. 把對應controller初始化
4. 找到匹配的方法,並執行
5. 該方法根據請求的變數呼叫對應model的方法,
6. 該方法同樣也會準備好回傳的資訊結構,並把它傳給view
7. view部分會渲染html,用得到的資訊在頁面需要的地方展示。
這種模式比一開始的「每個php檔案都是乙個網頁」要優越不少。但是對一些軟體工程師來說,這仍舊是乙個夢靨。下面是一些常見的抱怨
1. frontcontroller php 檔案仍舊是在全域性命名空間下操作
2. 慣例比配置缺少模組化
2.1 url 的routing會缺少變化
2.2 controlls會跟view綁的比較死
2.3 即使系統提供了重寫,慣例導致了應用很難在沒有大量重複**的情況下,構建model,view或者controller
正如你可能猜到那樣,magento的開發團隊有這樣的觀點,所以用了更加抽象的mvc模式。
1. 乙個單獨的php檔案來解析url。
2. 這個php檔案例項化magento應用
3. magento應用例項化frontcontroller物件
4. front controller物件例項化定義在全域性配置檔案裡的router物件
5. routers檢查url是否匹配
6. 如果匹配,得到相應的actioncontroller和方法
7. 例項化actioncontroller,呼叫所請求的方法
8. 這個方法會例項化,並呼叫請求相對應的模型
9. action controller將會例項化layout物件
10. layout物件會根據請求變數和系統屬性(也就是handles),建立該請求用到的block物件們
11. layout同樣會呼叫block的輸出方法,這些方法內建了渲染
12. 每個block都有乙個對應的template檔案。block包含了php 邏輯,template包含了html和php**
13. blocks會直接找data來得到資料。換句話說,action controller不會把資料傳給blocks。
最終我們會涉及到所有的部分,不過目前我們先看frontcontroller->routers->action controller部分。
了解了基本理論後,我們可以進入實戰了。我們將會做
1. 建立乙個hello world 模組
2. 配置該模組,並給出路由
3. 建立該模組的行為
首先安裝之前做的,建立目錄結構
然後建立配置檔案 …/etc/config.xml
0.1.0
true
local
最後確認能在admin裡模組管理裡看到它的存在。
1. 清楚快取
2. admin->system->configuration->advanced
3. 展開disable modules output
4. 確保xstarx_helloworld 出現
乙個route是把url轉化成actioncontroller和呼叫其方法的關鍵。不像其他的php mvc系統,你需要自己顯式定義路徑,在config.xml檔案裡(記住,它會被載入到全域性的config檔案中的)
standard
xstarx_helloworld
helloworld
我們這裡遇到了很多新的術語
什麼是?
標籤表示magento區域。從現在開始,把區域作為乙個單獨的magento應用。「frontend」是訪問magento的外界表現。「admin」區域是管理端控制台私有的。「install」區域是在首次安裝magento時使用的。
為什麼需要標籤,在我們只配置乙個route的情況下
在計算機科學界有句著名的名言,來自phil karlton
「在電腦科學裡只有兩個事情最難:cache有效性和命名物品」
magento同樣對命名也很頭疼。你會在系統裡,全域性配置檔案裡有大量不直接或者很含糊不清的名字。此處就是類似的問題。有時標籤會包含routers的資訊,其他時候會包含實現routing的router物件。乍看上去我們會覺得這都是直覺,但是隨著對magento的深入理解,會慢慢發現這種世界觀會更好點。
什麼是?
當router解析url時,會做如下分割
因此,在 標籤下定義 「helloworld」, 就以為著magento知道我們想讓url表現為
很多magento的新手會對frontcontroller物件和frontname感到費解。他們實際上不是同樣的東西。frontname僅僅是用來routing。
標籤用了做什麼?
這個標籤通常是模組名字的小寫。我們模型的名字是helloworld,所以標籤的名字就是helloworld。
同樣的frontname可以和module名字一樣。這個是潛規則,但不是強制規則。事實上,乙個module可能會定義多個,因此他可以有多個frontname。
標籤是用了幹嘛的?
這個模組標籤是模組名字的全名,包含了package/namespace. 這是用來定位我們的controller檔案的。
最後一步就是建立action controller了。建立
…/xstarx/helloworld/controllers/indexcontroller.php
裡面新增下面的**
classxstarx_helloworld_indexcontroller extends mage_core_controller_front_action)。
如果url是不完整的,magento會用index作為預設,這也是為什麼下面兩個url等價
如果我們有乙個url是這樣 http://localhost/magento/checkout/cart/add
magento會怎麼做呢
1. 首先查詢全域性配置檔案,找到frontname(mage_checkout)對應的module
2. 查詢cartaction controller ( mage_checkout_cartcontroller )
3. 呼叫cartaction controller 下面的addaction方法。
其他action controller技巧
在我們的action controller裡增加乙個非預設方法
public functiongoogbyeaction()
echo 「goodbye world!」;
訪問下面的url來驗證結果
因為我們會擴充套件mage_core_controller_front_action類,我們會有一些父類方法。例如url的引數部分會被解析為key/value對。在我們的action controller裡增加如下方法
public functionparamsaction()
echo 『』
foreach($this->getrequest()->getparams() as$key=>$value )
echo 『param:.$kye. 『』;
echo 『value:.$key. 『』;
echo 『』;
在訪問下面的url
我們可以看到每個引數和對應的值都被列印出來了。
最後我們看看如果想要 http://localhost/magento/helloworld/messages/goodbye執行需要什麼。我們首先建乙個檔案 …/xstarx/helloworld/controllers/messagecontroller.php
並且命名為 xstarx_helloworld_messagescontroller
然後新增方法如下
public functiongoodbyeaction()
echo 『another goodbye!』;
簡而言之,這就是magento如何實現mvc的controller。比其他php mvc框架要複雜一些。但是憑此靈活性,你可以構建你任何想要的url結構。
開發筆記2
開發筆記2 2012 5 4 周五 系統報警資訊傳送程式開發。其它程式收集了報警資訊,如 硬碟滿 硬碟壞 網路連不通 使用者欠費 硬體裝置無法訪問等,這些程式已經實現了插入資料到幾張不同型別的表,類似流水日誌表,狀態變化表。我則在這個基礎上,對這些表寫個簡單觸發器,觸發器盡量簡單,然後呼叫同乙個儲存...
android 開發筆記(2)
sharedpreferences 是android平台上乙個簡單的儲存,可以儲存一下開發的簡單的資訊,比如使用者的預設背景,在 中看到了博主對這個方法的解釋,現在借用樓主兩個 儲存端的 editor sharedata getsharedpreferences data 0 edit shared...
wp7開發筆記(2)
下面我們開始學習了。1.今天建立乙個專案,做個hello word的例子,首先點選 建立專案。上文中提到的6個專案型別,我們選擇第乙個。單擊ok建立。這時我們將看到,專案的介面 大致結構如圖。當然第一次可能沒有屬性一欄,你需要按下圖選擇並顯示 你可以單擊手機介面的相應控制項修改屬性。下面我們新增乙個...