Hunt framework 1.0.0 正式版,三年来最大更新

冰力
 冰力
发布于 2018年06月04日
收藏 15

Hunt framework 通过三年的不断完善,HuntLabs 所有成员很高兴的对外宣布 hunt 1.0.0 正式版,经过了 0.4.x / 0.5.x / 0.7.x / 0.9.x / 0.10.x 的一些重要分支,我们改进了很多不方便使用的地方,同时带来了更好的性能。

主要更新特性: 

* 增强 Controller 以及提升 Action 可用性和便捷性 
* 重新梳理 config/application.conf 配置文件 
* 改进对静态文件的访问,实现真正的全栈框架 
* 改进路由正则表达式匹配规则 
* 参照 Java JPA 思想实现了ORM持久化框架 Entity 
* 参照 Spring boot 2.0 对 Entity 和 hunt 的整合增加 repository 模块,进一步简化数据库操作 
* 支持二级缓存的 UCache(后面考虑一下跟 红薯 商量出个D语言版本 j2cache) 
* 进一步加强改进 Collie 的整合 
* 参照了 Django(jinja2) 和 Symfony(twig)实现了 hunt 的模板引擎模块 
* 重构 Session 模块 
* 重构 Cookie 功能 
* 改进 Request 常规 API 
* 改进 Response 使用规则,更新 API 
* 改进 Middleware 规则,参照 Django 
* 使用 kiss.logger 替代标准库的日志模块 
* 核心网络模块使用 kiss.net.TcpStream 完成,有很大的性能改进,具体可以参看 kiss

总而言之我们把此次版本定义为 1.0 是一个重要的里程碑版本,相信 Hunt framework 的易用性和可靠性加上 Dlang 以身俱来的性能可以为更多开发者提供便利,我们觉得 hunt 更适合 C++ 和 php 开发者尝试使用,后面我们也会推出各种示例代码给大家,甚至开源一些常用的系统。

基础功能改进

配置文件优化

以前的配置项比较简洁,但是很多人说不够清晰,这次也重新整理了一次,改进的比较多举一个数据库配置的例子给大家:

老配置文件:

database.url=mysql://root:123456@localhost:3306/test?charset=utf8

新配置文件:

hunt.database.default.driver=mysqk
hunt.database.default.host=localhost
hunt.database.default.port=3306
hunt.database.default.database=test
hunt.database.default.username=root
hunt.database.default.password=123456
hunt.database.default.charset=utf8
hunt.database.default.prefix=

Controller

API改进:

控制器的Action支持多种类型返回,其中包括:string、数值类型、void、bool、Response、JsonResponse、RedirectResponse等。

应用示例:

// 模块定义
module app.controller.IndexController;

// 中间件定义
class IpFilterMiddleware : MiddlewareInterface
{
    override string name()
    {
        return IpFilterMiddleware.stringof;
    }

    override Response onProcess(Request req, Response res)
    {
        writeln(req.session());
        return null;
    }
}

// Controller定义
class IndexController : Controller
{
    mixin MakeController;
    this()
    {
        this.addMiddleware(new IpFilterMiddleware());     // 中间件注入
    }
    // 通过@Action标识动作
    @Action string index()
    {
        JSONValue model;
        model["title"] = "Hunt demo";
        model["now"] = Clock.currTime.toString();
        view.setTemplateExt(".dhtml");
        return view.render("home", model);                // 返回模板视图定义的内容
    }

    // 方法名以Action结尾时,可自动识别为动作
    Response showAction()
    {
        Response response = new Response("Hello world<br/>");
        response.setHeader(HttpHeaderCode.CONTENT_TYPE, "text/html;charset=utf-8")
        .cookie("name2", "value", 10000)                // Cookie设置
        .header("X-Header-One", "Header Value")            // 自定义头标识定义
        .withHeaders(["X-Header-Two":"Header Value", "X-Header-Tree": "Header Value"]);  // 批量添加头标识
        return response;
    }
}

更多信息请参考:https://github.com/huntlabs/hunt/wiki/Configuration

Request

API改进:

request.method;             // return GET or POST
request.path;                 // return /path/to/request
request.GET;                // return all get params
request.POST;               // return all post params
request.allFiles;            // return all files params
request.get!int("id");     // fetch uid as int from get params
request.post!int("id");    // fetch uid as int from post params
request.session();          // return session object
request.ip();               // client ip address

主要参考项目:LaravelSymfony 等 更多信息请参考:https://github.com/huntlabs/hunt/wiki/Request

Response

API改进:

Response showAction()
{
    Response response = new Response("Hello world<br/>");
    response.setHeader(HttpHeaderCode.CONTENT_TYPE, "text/html;charset=utf-8")
    .cookie("name2", "value", 10000)                // Cookie设置
    .header("X-Header-One", "Header Value")            // 自定义头标识定义
    .withHeaders(["X-Header-Two":"Header Value", "X-Header-Tree": "Header Value"]);  // 批量添加头标识

    return response;
}

新增Response类型

JsonResponse
RedirectResponse

主要参考项目:LaravelSymfony 等 更多信息请参考:https://github.com/huntlabs/hunt/wiki/Response

Routing

路由表规则改进

1)url路径支持正则匹配

GET    /user/{id<\d+>}   user.detail

2)不再支持相同路径定义

# 以下条目存在冲突
*        /home                        index.show
GET        /home                        index.index

3) 不需要再手动添加/静态路径 Router会根据情况自动添加以下路由,默认将wwwroot目录做为静态文件路径,配置项可修改。

hunt.http.path=wwwroot/

4)静态Index文件搜索 如果路由路径未完全匹配上Controller上的Action方法,则转去搜索静态文件,文件格式为路径+默认静态文件。默认静态文件如下:

index.html, index.htm, default.html, default.htm, home.html

应用举例

GET    /                 index.index
GET    /users            user.list
GET    /user/{id}        user.detail
GET    /user/{id<\d+>}   user.detail

主要参考项目:Play FrameworkDjango等 更多信息请参考:https://github.com/huntlabs/hunt/wiki/Routing

Session

API改进: 主要参考项目:Laravel

应用举例:

struct SessionSettings
{
    string storage = "memory";
    string prefix = "huntsession_";
    string args = "/tmp";
    uint expire = 3600;
}

class SessionTest
{
    private SessionStorage storage;
    private Session session;
    private    SessionSettings sessionSettings;

    this()
    {
        trace("testing Session");
        sessionSettings.expire = 60;
        storage = createSessionStorage(sessionSettings);
    }

    void start()
    {
        testSetName();
        testReplace();
    }

    void testSetName()
    {
        session = new Session(storage, false);
        this.assertEquals("hunt_session", this.session.getName());
        this.session.setName("session.test.com");
        this.session.start();
        this.assertEquals("session.test.com", this.session.getName());
    }

    void testReplace()
    {
        this.session.replace(["happiness": "be good", "symfony" : "awesome"]);
        this.assertEquals(["happiness" : "be good", "symfony" : "awesome"], this.session.all());
        this.session.replace(null);
        this.assertEquals(null, this.session.all());
    }
}

更多信息请参考:https://github.com/huntlabs/hunt/wiki/Session

View

模板引擎重构

View模板

<title>{{ user.name }}</title>
<title>{{ user.age }}</title>

Controller定义

@Action string index()
{
    struct User
    {
        string name;
        int age;
    }

    User user;
    info.name = "Hunt demo";
    user.age = 18;

    // 给模板变量赋值
    view.assign("user", user);

    return view.render("home");                // 返回模板视图定义的内容
}

更多信息请参考:https://github.com/huntlabs/hunt/wiki/View

Database

基于 Entity 整合了 repository 概念,简化ORM开发。

应用举例:

数据实体模型定义

module app.model.User;

import entity;

@Table("users")
class User : Entity
{
    @AutoIncrement
    @PrimaryKey
    int id;
    string name;
    string email;
}

数据集定义

module app.repository.UserRepository;

import app.model.User;
import entity;

class UsersRepository : EntityRepository!(User, int)
{
}

CRUD操作

auto repository = new UserRepository;

// 插入
User user = new User;
user.name = "Brian";
user.email = "zoujiaqing@gmail.com";

auto user = repository.save( user );
// 查找
auto user = repository.findById( id );
// 删除
repository.remove( id );

Cache

应用举例:

@Action string testcache()
{
    string key = request.get("key");
    string value = request.get("value");

    cache.put(key, value);

    return cache.get(key);
}

相关地址

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:Hunt framework 1.0.0 正式版,三年来最大更新
资讯来源:开源中国原创
加载中

精彩评论

南山北寺
南山北寺
虽然我没有用过Dlang 但是还是顶一下作者!
开源狂人
开源狂人
这种集各框架优点于一身,让我想起了国产007里“要你命3000”
冰力
冰力

引用来自“南山北寺”的评论

虽然我没有用过Dlang 但是还是顶一下作者!
Dlang 优势也很明显,特别像 PHP、C++、JAVA、C# 的语法,而且不用搭环境直接跑,使用简单性能也好。
渡世白玉
渡世白玉
顶一个、、dlang 的 web端解决方案全了、、
l
l龙卷锋
已试用,搭建了简单个人博客,简单好用😎

最新评论(27

冰力
冰力

引用来自“zjh6”的评论

文档及网站还不是很完善.加油!
文档和网站会陆续完善,可以先看看 wiki https://github.com/huntlabs/hunt-framework/wiki
z
zjh6
文档及网站还不是很完善.加油!
Alex-loongkylin
Alex-loongkylin
感恩开发团队,感恩缘分!
r
rxqn2008
👍 真心不错!
冰力
冰力

引用来自“Wizzer”的评论

#NutzWk# 发来贺电~~😁
感谢捧场 😝
冰力
冰力

引用来自“pauli”的评论

多少人用 D?估计很少吧
还是挺多人用的,只是圈子太分散
冰力
冰力

引用来自“渡世白玉”的评论

顶一个、、dlang 的 web端解决方案全了、、
你们有什么新项目可以用 hunt 😃
渡世白玉
渡世白玉
顶一个、、dlang 的 web端解决方案全了、、
冰力
冰力

引用来自“罗格林”的评论

#ActFramework# 发来贺电 😃
@罗格林 谢谢 格林兄
返回顶部
顶部