请问如何通过ctx获取当前的模块,控制器,和方法名,谢谢
[eggjs/egg]请问如何通过ctx获取当前的模块,控制器,和方法名,谢谢
回答
同问
请问一下egg,有没有类似ruby on rails的方法获取当前的controller_name、action_name
body data={page: controller_name + '_' + action_name}
这样就可以在view中区分不同的页面
使用过内置的egg-logger就知道,可以获取完整路径和模块名:this.fullPath
和this.pathName
,它们好像绑在了BaseContextClass
的原型链,理论上来说能在任何模块拿到。
至于action_name是对应着某个控制器的函数么? 早期可以通过arguments.callee来动态获取函数名,不过ES5开始就废弃了。现在一般直接是通过Function.name
最后,不清楚你获取这些的意义在哪,能明确一下具体场景么? @467057463
为什么controller要和view强关联,不应该是对应着router吗? 如果不满足于RESTful API需要加模板渲染,那也应该是对应请求路径而不是模块名不对吗?
router.get('some_path_name', '/xxx', controller.xx)
ctx.routerName/ ctx.routerPath
@unclexiao 首先表示感谢~~~ action_name就你说的控制器函数。 我公司项目用的是ruby on rails,我们一般用controller_name和action_name来标示页面。 例如在layout 的body标签上加:
<body class=`${controller_name}_${action_name}`></body>
当访问 articles/new
和 articles/1/edit
时,动态的生成body的class分别为:
<body class="articles_new"></body>
<body class="articles_edit"></body>
通常articles/new(新建)
和 article/edit(编辑)
大部分逻辑是共用的。
这样css、js 就可以通过:
.articles_new, .article_edit{
// css
}
App.Page.on('article_new, article_edit', function(){
// js
})
编写通用的部分代码。
最后,谢谢大佬,刚入egg,还在学习当中,祝egg越来越好
@unclexiao eggjs 有能获取所有路由的方法嘛,把route.js所有注册的路由给返回个array出来。还是只能从app.router.stack里面遍历出path出来?
你自己封装个方法不就得了
能提供个思路吗?
Function.name这个怎么拿?
纯代码层面,你封装一个 app.registerRouter 给开发者用,里面就可以自己记录了。或者 Proxy 下 router 的方法。