openresty前端開發輕量級MVC框架封裝一(控制器篇)
通過前面幾章,我們已經掌握了一些基本的開發知識,但是程式碼結構比較簡單,缺乏統一的標準,模組化,也缺乏統一的異常處理,這一章我們主要來學習如何封裝一個輕量級的MVC框架,規範以及簡化開發,並且提供類似php所見即所得的能力
統一入口
通常來說一個mvc框架會有一個統一的入口點,類似於spring mvc的DispatcherServlet,會攔截所有的請求,也就是/,於是我們可以得出我們的入口點
conf/nginx.conf
worker_processes 1;
error_log logs/error.log notice;
events {
worker_connections 1024;
}
http {
lua_package_path "/Users/john/opensource/openresty-web-dev/demo8/lua/?.lua;/Users/john/opensource/openresty-web-dev/demo8/lualib/?.lua;/usr/local/openresty/lualib/?.lua";
server {
listen 80;
server_name localhost;
lua_code_cache off;
location / {
content_by_lua_file lua/mvc.lua;
}
location ~ ^/js/|^/css/|.html {
root html;
}
}
}
除了靜態檔案js/css/html檔案,其他的請求都會被我們的mvc.lua處理。
預設頁面
當請求uri為空時,預設返回index.html頁面,當然也可以自己定義,實現這個效果很簡單
local uri = ngx.var.uri
-- 預設首頁
if uri == "" or uri == "/" then
local res = ngx.location.capture("/index.html", {})
ngx.say(res.body)
return
end
url解析
這裡簡單的把url解析成模組名模組方法,根據/分割,如果只有模組名,沒有方法名,則預設為index方法
local m, err = ngx.re.match(uri, "([a-zA-Z0-9-]+)/*([a-zA-Z0-9-]+)*")
local moduleName = m[1] -- 模組名
local method = m[2] -- 方法名
if not method then
method = "index" -- 預設訪問index方法
else
method = ngx.re.gsub(method, "-", "_")
end
動態Controller模組
得到模組名之後,需要動態引入模組,通過pcall,然後再呼叫模組的方法
-- 控制器預設在web包下面
local prefix = "web."
local path = prefix .. moduleName
-- 嘗試引入模組,不存在則報錯
local ret, ctrl, err = pcall(require, path)
local is_debug = true -- 除錯階段,會輸出錯誤資訊到頁面上
if ret == false then
if is_debug then
ngx.status = 404
ngx.say("<p style=`font-size: 50px`>Error: <span style=`color:red`>" .. ctrl .. "</span> module not found !</p>")
end
ngx.exit(404)
end
-- 嘗試獲取模組方法,不存在則報錯
local req_method = ctrl[method]
if req_method == nil then
if is_debug then
ngx.status = 404
ngx.say("<p style=`font-size: 50px`>Error: <span style=`color:red`>" .. method .. "()</span> method not found in <span style=`color:red`>" .. moduleName .. "</span> lua module !</p>")
end
ngx.exit(404)
end
-- 執行模組方法,報錯則顯示錯誤資訊,所見即所得,可以追蹤lua報錯行數
ret, err = pcall(req_method)
if ret == false then
if is_debug then
ngx.status = 404
ngx.say("<p style=`font-size: 50px`>Error: <span style=`color:red`>" .. err .. "</span></p>")
else
ngx.exit(500)
end
end
異常處理
可以看到,從引入模組,到獲取模組方法,已經執行方法,都有可能報錯,這裡通過pcall來進行呼叫,這種方式可以安全的呼叫lua程式碼,不會導致異常中斷,然後通過定義一個變數,來區分是否為開發除錯階段,如果是則把錯誤資訊輸出到瀏覽器端,否則直接報404或者500,避免把錯誤資訊輸出到客戶端,導致程式碼洩漏。
至此,一個簡單的mvc框架已經可以使用了,但是現在還只能做前端渲染,下一章,我講介紹如果進行服務端渲染。
示例程式碼 參見demo8部分
相關文章
- 一個輕量級WebFramework開發框架介紹WebFramework框架
- ThinkGo:一個輕量級的 Go 語言 MVC 框架GoMVC框架
- Nancy .Net 輕量級mvc框架使用(3)控制器中三種返回方式簡析NaNMVC框架
- .NET輕量級MVC框架:Nancy入門教程(一)——初識NancyMVC框架NaN
- openresty前端開發入門五之Mysql篇REST前端MySql
- openresty前端開發入門四之Redis篇REST前端Redis
- 用go設計開發一個自己的輕量級登入庫/框架吧(業務篇)Go框架
- openresty前端開發序REST前端
- PhalApi(π框架) - PHP輕量級開源介面框架API框架PHP
- Nancy .Net 輕量級mvc框架使用(1)搭建一個簡單專案NaNMVC框架
- Solon 1.6.25 釋出,輕量級應用開發框架框架
- openresty前端開發入門三之JSON篇REST前端JSON
- Nancy .Net 輕量級mvc框架使用(5)Routing路由方式整理NaNMVC框架路由
- Solon 1.6.18 釋出,輕量級應用開發框架框架
- 超輕量級MP4封裝方法介紹封裝
- 輕量級ORM框架——第一篇:Dapper快速學習ORM框架APP
- 輕量級IOC框架:Ninject框架
- 用go設計開發一個自己的輕量級登入庫/框架吧(專案維護篇)Go框架
- openresty前端開發入門二REST前端
- .NET輕量級MVC框架:Nancy入門教程(二)——Nancy和MVC的簡單對比MVC框架NaN
- 用go設計開發一個自己的輕量級登入庫/框架吧Go框架
- Flutter路由輕量級框架FRouterFlutter路由框架
- 輕量級orm框架——gzero指南ORM框架
- 輕量級Web框架Flask(二)Web框架Flask
- 超輕量級PHP框架BroPHPPHP框架
- ColyseusJS 輕量級多人遊戲伺服器開發框架 - 中文手冊(系統保障篇)JS遊戲伺服器框架
- Spring 5| 輕量級的開源JavaEE框架SpringJava框架
- 58同城開源其輕量級Web框架ArgoWeb框架Go
- Solon & Solon Cloud 1.5.62 釋出,輕量級 Java 基礎開發框架CloudJava框架
- 輕量級 Java 基礎開發框架,Solon & Solon Cloud 1.5.48 釋出Java框架Cloud
- 輕量級 Java 基礎開發框架,Solon & Solon Cloud 1.5.40 釋出Java框架Cloud
- RxHttp - 輕量級、可擴充套件、易使用、完美相容MVVM、MVC架構的網路封裝類庫HTTP套件MVVMMVC架構封裝
- 強大的輕量級開源框架web.py安裝詳解框架Web
- 封裝JDBC—非框架開發必備的封裝類封裝JDBC框架
- 仿Laravel寫了一個輕量級的框架Laravel框架
- 一個輕量級的引數校驗框架框架
- CherryPy :一個輕量級的 Python Web 框架PythonWeb框架
- Nancy .Net 輕量級mvc框架使用(2)專案中新增aspx頁面方式NaNMVC框架