作為一名程式設計師,了解您正在使用的系統的流程很重要,這不僅是為了能夠在需要時進行更改,而且因為這樣做可以使您信心倍增。
今天,我們將選擇opencart並對其進行剖析,以了解排程過程的基礎。 我們將從排程過程的全部內容開始,並且隨著我們的前進,我們將從框架的不同部分探索**片段。
我將為本文選擇opencart的最新版本,但其流程在早期版本中或多或少都相似。
在任何基於web的應用程式中,排程過程都用於查詢傳入請求url與框架中相應模組之間的對映。 當然,實現因框架而異,但基本概念保持不變。 因此,這是排程程式的一些職責:
讓我們嘗試使用opencart中的乙個簡單示例來理解這一點。 要從前端建立新使用者,需要使用在**上進行註冊。 讓我們總結一下opencart為呈現請求的頁面而採取的步驟。
因此,這是opencart如何遍歷請求的url並返回響應的頂層檢視。 在下一節中,我們將更深入地了解它是如何做到的。
繼續並在opencart的文件根目錄中開啟index.php
檔案。 該檔案中發生了很多事情,但不要被淹沒,因為大多數只是整個框架中使用的物件的設定。
讓我們直接從該檔案中提取我們感興趣的片段。
// front controller
$controller = new front($registry);
// maintenance mode
$controller->addpreaction(new action('common/maintenance'));
// seo url's
$controller->addpreaction(new action('common/seo_url'));
與大多數其他框架一樣,opencart也依賴於前控制器模式,因此應用程式中的所有請求都有乙個公共入口點。
首先,我們建立前端控制器的例項,並將其分配給$controller
變數。 緊接著,我們正在呼叫addpreaction
方法來新增幾個動作。
現在,這帶來了另乙個話題:什麼是「 preaction」? 簡單來說,preaction是乙個動作,它將在任何頁面上的請求動作之前執行。 例如,當使用者單擊任何頁面時,您要在返回實際響應之前檢查站點是否處於維護模式。 在這種情況下,您可以使用preaction,以便將使用者重定向到維護頁面(如果處於開啟狀態)。
另外,我們還新增了common/seo_url
作為preaction,因為在啟用seo的**上,我們希望在實際分派開始之前獲取相應的路由變數。
讓我們繼續下乙個重要的**片段。
// router
if (isset($request->get['route'])) else
它檢查「 route」查詢字串變數的存在,如果存在,我們將通過傳遞當前的「 route」值作為構造函式引數來建立action
類的例項。 如果不存在,我們將對主頁路由uri(common/home
執行相同的操作。
將$action
變數設定為適當的值後,我們繼續下乙個**段。
// dispatch
$controller->dispatch($action, new action('error/not_found'));
最後,我們呼叫前端控制器類的dispatch
方法。 繼續開啟system/engine/front.php
並找到以下片段。
public function dispatch($action, $error)
}while ($action)
}
這是所有魔術發生的方法! 首先,它執行前面討論的所有「 preaction」。 此外,在while迴圈中,它將嘗試執行我們當前的$action
,將其作為execute
方法的引數傳遞。
讓我們遵循同一檔案中execute
方法的定義。
private function execute($action) elseif ($result === false) else
return $action;
}
在第一行,將execute
action
類的execute
方法。 不要將其與front控制器類的execute
方法混淆。 開啟檔案system/engine/action.php
,就在這裡。
public function execute($registry)
if (is_file($this->file)) else
} else
}
這裡要注意的重要一點是,當在index.php
例項化操作物件時,action
類已經在建構函式中設定了必需的變數。 它設定了file
,class
和method
屬性,這些屬性將在execute
方法中使用。 為了使事情不那麼複雜,我們將只討論execute
方法,儘管我建議您遍歷action
類的建構函式。
回到action
類的execute
方法,它檢查與當前路由關聯的檔案($this->file
)是否存在。 如果一切正常,它將包含該檔案,並使用call_user_func
函式呼叫該控制器類的相應方法($this->method
),並返回響應。
如果關聯的檔案不可用,它將返回false
。 現在,讓我們回到front控制器類的execute
方法中的**段。 耐心點,我們快到了!
...
$result = $action->execute($this->registry);
if (is_object($result)) elseif ($result === false) else
return $action;
...
一旦action
類的execute方法完成了該過程,它將返回結果並將其分配給$result
變數。 現在,存在三種不同的可能性,其值儲存在$result
。 讓我們檢查每個。
如果一切順利,我們將在$result
變數中提供html輸出,因此$action
變數將設定為false
並結束過程。 這是最後一種情況。
回想一下,如果在action
類的execute
方法中找不到相應的控制器檔案,則返回false
。 在這種情況下,$action
變數將設定為$this->error
(error / not_foundaction
),並向使用者顯示「找不到頁面」。
最後,如果我們發現$result
是物件本身,則將其設定為$action
變數。 是的,這很奇怪:為什麼在應該為請求的頁面返回html輸出的情況下,控制器方法究竟會返回另乙個action
物件? 但這只是控制器將使用者重定向到其他url的方式之一。
讓我們快速開啟catalog/controller/common/maintenance.php
檔案並檢視其運**況。 在index
方法中,如果滿足某些條件,它將返回action
物件。
…
if (($route != 'payment' && $route != 'api') && !$this->user->islogged())
…
因此,如您所見,它返回action
物件以將使用者重定向到common/maintenance/info
url。 當然,前端控制器類的dispatch
方法中有乙個**可以處理此行為。 回憶一下該方法中的**片段-我保證這是本教程的最後乙個**片段。
...
while ($action)
...
因此,這是乙個while迴圈,它將一直執行到找到$action
變數設定為false
為止! 更具體地說,當我們為使用者提供有用的輸出時,它將結束迴圈。
這就是旅程的終點。 我希望它不會像乍看起來那樣複雜。
今天,我們經歷了opencart框架的重要方面-排程過程。 我們了解了排程的基礎知識,並通過完整的流程來了解排程的工作原理。
如果您正在尋找其他opencart工具,實用程式,擴充套件等,以便可以在自己的專案中使用或用於自己的教育,請不要忘記檢視我們在市場上提供的產品 。
翻譯自:
linux中的工作排程
一 linux中工作排程的種類 1 例行性工作排程 每隔一定時間就要辦的事情,如上班打卡 linux中通過crontab命令,實現例行性工作排程 2 突發性工作排程 僅執行一次就結束的,如打折 linux中通過at命令,實現突發性工作排程 二 at at用來處理僅執行一次就結束排程的命令,不過要執行...
SLM中KPI Assignment 工作原理
b slm中kpi assignment 工作原理 b kpis in service based agreements 1 只有當滿足一下2個條件時候,kpi才自動分配給monitor ci 1 在kpis valid assignments xml檔案中,該kpi被分配給該ci。2 改kpi被包...
原 gulp工作中的實戰
寫這篇文章的目的是為了以後的專案中懶得再去配gulp,直接可以拿這篇部落格中的來用,因為有時候配置還是挺煩人的。1 del 刪除檔案,用於清空檔案 2 browser sync 用於自動重新整理瀏覽器,從此再也不用f5手動重新整理了 3 gulp htmlmin 用於壓縮html 4 gulp cl...