最佳实践
控制器基类
同一个分组下的Controller一般会有一些共同的特性,那么就可以把这些共同的特性放在一个控制器基类里,其他的控制器继承该控制器。
建议控制器基类名为BaseController,如:
// App/Lib/Controller/Home/BaseController.jsmodule.exports = Controller(function(){return {init: function(http){this.super("init", http);//给模版里设置title等一些字段this.assign({title: "thinkjs官网",navType: "home"})},//获取页面顶部的分类,几乎每个页面都会使用//那么可以放在基类里,供子类调用getCate: function(){var self = this;return D('Cate').select().then(function(data){self.assign("cateList", data);})}}})
基类可以通过BaseController来继承,如:
// App/Lib/Controller/Home/IndexController.jsmodule.exports = Controller("Home/BaseController", function(){return {indexAction: function(){var self = this;//获取分类列表var catePromise = this.getCate();//获取文章列表var articlePromise = D('Article').page(this.page("page")).select().then(function(data){self.assign("articleList", data);})//分类和文章列表数据都OK后渲染模版return Promise.all([catePromise, articlePromise]).then(function(){return self.display();})}}})
用户登录后才能访问
在项目中,经常要判断当前访问的用户是否有权限,如果没有权限那么后续的代码就不能在执行。最基本的案例就是判断用户是否已经登录,比如:后台管理
// App/Lib/Controller/Admin/BaseController.jsmodule.exprots = Controller(function(){return {init: function(http){this.super("init", http);var self = this;return this.session("userInfo").then(function(userInfo){//用户信息为空if(isEmpty(userInfo)){//ajax访问返回一个json的错误信息if(self.isAjax()){return self.error(403, "用户未登录,不能访问")}else{//跳转到登录页return self.redirect("/login");}}else{//用户已经登录self.userInfo = userInfo;self.assign("userInfo", userInfo);}})}}})
由于error和redirect方法返回的都是pendding promise,如果未登录的话,可以阻止后续的代码继续执行。
indexAction: function(){//init方法里将用户信息赋值到this.userInfo上,那么这里就可以直接获取了var userInfo = this.userInfo;var id = userInfo.id;}
