lua-resty-mvc

你不需要那么复杂的 MVC 框架

$ opm get pronan/lua-resty-mvc

lua-resty-mvc

你不需要那么复杂的 MVC 框架! 只要一个简单的文件夹和几个简单的文件,你就可以享受基本的但最常用的 MVC 功能。

依赖

lua-resty-mysql

lua-resty-reqargs

在项目中使用

参见 op,它为这个网站 httper.cn 提供动力。

快速入门

lib/resty/mvc/query.lua 中配置你的数据库,并尝试从 nginx -p . -c nginx.conf 启动,并访问 http://

API 尝鲜

下面是五个模型,代表五个数据库表。为什么有这么多表?因为我想向你展示 MVC 是多么强大。

模型关系

|模型名称|col_1|col_2|col_3|col_4|col_5| |---|---|---|---|---|---| |Moreinfo|weight|height|||| |Detail|sex|age|info::Moreinfo||| |User|name|money|detail::Detail||| |Product|name|price|||| |Record|buyer::User|seller::User|product::Product|count|time| 符号 :: 表示外键关系 ## API 示例 如果你好奇,请运行这个项目并访问 http:// 查看最终的 SQL 语句。

    User:where()
    User:where{}
    User:where{id=1}
    User:where{id__gt=2}
    User:where{id__in={1, 2, 3}}
    User:where{name='kate'}
    User:where{name__endswith='e'}
    User:where{name__contains='a'}
    User:where{id=1, name='kate'}
    User:where{id=1}:where{name='kate'}
    User:where{id__lt=3, name__startswith='k'}
    
    User:where{Q{id__gt=2}}
    User:where{Q{id__gt=2}, Q{id__lt=5}}
    User:where{Q{id__gt=2, id__lt=5}}
    User:where{Q{id__gt=2, id__lt=5}}:where{Q{name__startswith='k'}}
    User:where{Q{id__gt=2, id__lt=5}}:where{name__startswith='k'}
    User:where{Q{id__gt=2}/Q{id__lt=5}*Q{name__startswith='k'}}
    User:where{Q{id__gt=2}/Q{id__lt=5}, name__startswith='k'}
    
    
    Record:where{buyer=1}
    Record:where{buyer__gt=1}
    Record:where{buyer__in={1, 2}}
    Record:where{buyer__name='kate'}
    Record:where{buyer__name__startswith='k'}
    Record:where{Q{buyer__name__startswith='k'}/Q{buyer__money__gt=100.2}}
    Record:where{Q{buyer__name__startswith='k'}/Q{seller__money__gt=100.2}/Q{product__price__lt=50}}
    
    Record:where{buyer=1}:join{'buyer'}
    Record:where{buyer=1}:join{'seller'}
    Record:where{buyer=1}:join{'buyer', 'seller'}
    Record:where{buyer=1}:join{'buyer', 'seller', 'product'}
    
    Record:where{seller__detail=1}
    Record:where{seller__detail__lt=1}
    Record:where{seller__detail__in={1, 2, 3}}
    Record:where{seller__detail__sex='w'}
    Record:where{seller__detail__age=20}
    Record:where{seller__detail__age__gt=20}
    Record:where{seller__detail__info=2}
    Record:where{seller__detail__info__lt=2}
    Record:where{seller__detail__info__in={1, 2}}
    Record:where{seller__detail__info__weight=55}
    Record:where{seller__detail__info__weight__gt=55}
    Record:where{seller__detail__info__weight__in={45, 55}}
    
    Record:where{Q{buyer__detail__age__gt=20}/Q{seller__detail__age__gt=20}}
    Record:where{Q{buyer__detail__info__weight__gt=20}/Q{seller__detail__info__height__gt=20}}
    Record:where{Q{seller__detail__info__weight__gt=20}/Q{buyer__detail__info__height__gt=20}, buyer__detail__info__height__lt=120}:join{'buyer'}
    Record:where{Q{seller__detail__info__weight__gt=20}/Q{buyer__detail__info__height__gt=20}, buyer__detail__info__height__lt=120}:join{'buyer', 'seller', 'product'}

概要

下面的代码展示了编写用户注册逻辑代码是多么容易。

    location = /register {
        content_by_lua_block{
            local UserForm = require"forms".UserForm
            local User = require"models".User
            local req = ngx.req
            local form;
    
            if req.get_method()=='POST' then
                req.read_body()
                form = UserForm:instance{data=req.get_post_args()}
                if form:is_valid() then
                    local cd=form.cleaned_data
                    local user = User:instance(cd) 
                    user.age = 22 -- set some value before saving to database
                    user.score = 150
                    local res, errors = user:save(true) -- `true` means insert a row to database, 
                    if not res then
                        return ngx.print('Fail to create user, '..table.concat(errors, '<br/>'))
                    else
                        return ngx.print(string.format(
                            'Congratulations! You have created a user successfully! <br/>'
                            ..'id:%s, Name:%s, Password:%s, Age:%s, Score:%s, Create time:%s.'
                            ..'<h1>now please try <a href="/login">login</a><h1>', 
                            user.id, user.username, user.password, user.age, user.score, user.create_time))
                    end
                end
            else
                form = UserForm:instance{}
            end
            local form_template=[[
                <!DOCTYPE html>
                <head>
                <title>lua-resty-mvc</title> 
                </head>
                <form method="post">
                %s
                <button type="submit">register</button>
                </form>
                </body>
                </html>]]
            return ngx.print(string.format(form_template, form:render()))
        }
    }

待办事项

  1. 列别名

更新日志

2016-10-07 支持外键

作者

Nan Xiang(@pronan)

许可证

2bsd

依赖

openresty

版本