magento 開發筆記2

2021-06-11 19:47:08 字數 4739 閱讀 4228

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建立。這時我們將看到,專案的介面 大致結構如圖。當然第一次可能沒有屬性一欄,你需要按下圖選擇並顯示 你可以單擊手機介面的相應控制項修改屬性。下面我們新增乙個...