Chicago Boss 框架控制器开发指南
控制器基础概念
Chicago Boss 是一个基于 Erlang 的 Web 框架,采用 MVC 架构模式。控制器作为核心组件,负责处理 HTTP 请求并返回响应。在 Chicago Boss 中,每个 URL 都会映射到控制器模块的特定函数。
控制器模块结构
控制器模块需要放置在项目的 src/controller/
目录下,命名格式为 应用名_控制器名_controller.erl
。例如,一个博客应用的控制器可以命名为 blog_post_controller.erl
。
控制器模块声明有两种形式:
-module(appname_my_controller, [Req]).
或者当启用会话功能时:
-module(appname_my_controller, [Req, SessionID]).
控制器函数设计
控制器函数通常接受 2-3 个参数:
- HTTP 请求方法(原子类型),如
'GET'
或'POST'
- URL 路径中的令牌列表(以斜杠分隔的部分)
- 可选的
before_
函数返回结果
路由匹配示例
% GET /blog/view
view('GET', []) ->
...;
% GET /blog/view/1234
view('GET', [Id]) ->
...;
% GET /blog/view/tag/funny
view('GET', ["tag", Tag]) ->
...;
在视图中生成对应 URL 的模板标签:
{{ '{% url action="view" %}' }}
{{ '{% url action="view" id="1234" %}' }}
{{ '{% url action="view" tag="funny" %}' }}
高级路由配置
除了控制器中的模式匹配,还可以在 priv/应用名.routes
文件中定义额外路由规则:
{"/", [{controller, "main"}, {action, "welcome"}]}.
{"/signup", [{application, "login"}, {controller, "account"}, {action, "create"}]}.
{404, [{controller, "main"}, {action, "not_found"}]}.
路由支持正则表达式匹配:
{"/([0-9]+)", [{controller, "coupon"}, {action, "redeem"}, {coupon_id, '$1'}]}.
授权控制
通过 before_/3
函数实现前置授权检查:
before_(Action, Method, Tokens) ->
my_user_lib:require_login(Req).
before_
函数可以返回:
{ok, ExtraInfo}
- 继续执行并将额外信息传递给动作{redirect, Location}
- 重定向到指定位置
控制器返回值
控制器动作可以返回多种类型的响应:
-
基本响应:
ok {ok, Variables} {ok, Variables, Headers}
-
JavaScript 响应:
js {js, Variables} {js, Variables, Headers}
-
重定向:
{redirect, Location} {moved, Location} % 301 永久重定向
-
JSON 响应:
{json, Data} {jsonp, Callback, Data}
-
流式响应:
{stream, Generator, Acc0}
-
错误响应:
not_found {StatusCode, Body, Headers}
缓存策略
Chicago Boss 提供了灵活的缓存机制:
- 在配置中启用缓存并设置缓存服务器
- 定义
cache_
函数指定缓存策略:
cache_("index", []) ->
{page, [{seconds, 30}]};
cache_("profile", [ProfileId]) ->
{vars, [{seconds, 300}, {watch, ProfileId ++ ".*"}]};
cache_(_, _) ->
none.
缓存选项:
seconds
- 缓存时间(秒)watch
- 监听的记录主题,当相关记录变更时自动失效缓存
多语言支持
框架内置多语言支持,可以通过以下方式控制语言:
-
在控制器动作返回的头部中指定:
{ok, Variables, [{"Content-Language", "zh-CN"}]}
-
定义
lang_
函数返回首选语言
最佳实践建议
- 保持控制器精简,将业务逻辑放在
src/lib/
目录下的辅助模块中 - 合理使用缓存提高性能,但注意缓存粒度
- 利用模式匹配简化路由处理
- 为需要权限的控制器动作添加
before_
检查 - 考虑多语言支持时,统一管理语言资源文件
通过掌握这些控制器开发技巧,您可以充分利用 Chicago Boss 框架构建高效、可扩展的 Web 应用。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考