OpenCart中的排程工作原理

2021-10-07 10:45:21 字數 4642 閱讀 3463

作為一名程式設計師,了解您正在使用的系統的流程很重要,這不僅是為了能夠在需要時進行更改,而且因為這樣做可以使您信心倍增。

今天,我們將選擇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;

}

在第一行,將executeaction類的execute方法。 不要將其與front控制器類的execute方法混淆。 開啟檔案system/engine/action.php,就在這裡。

public function execute($registry) 

if (is_file($this->file)) else

} else

}

這裡要注意的重要一點是,當在index.php例項化操作物件時,action類已經在建構函式中設定了必需的變數。 它設定了fileclassmethod屬性,這些屬性將在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/infourl。 當然,前端控制器類的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...