[eggjs/egg]请问如何通过ctx获取当前的模块,控制器,和方法名,谢谢

2024-07-22 289 views
5

请问如何通过ctx获取当前的模块,控制器,和方法名,谢谢

回答

3

同问

5

请问一下egg,有没有类似ruby on rails的方法获取当前的controller_name、action_name

body data={page: controller_name + '_' + action_name}

这样就可以在view中区分不同的页面

1

使用过内置的egg-logger就知道,可以获取完整路径和模块名:this.fullPaththis.pathName,它们好像绑在了BaseContextClass的原型链,理论上来说能在任何模块拿到。

至于action_name是对应着某个控制器的函数么? 早期可以通过arguments.callee来动态获取函数名,不过ES5开始就废弃了。现在一般直接是通过Function.name

最后,不清楚你获取这些的意义在哪,能明确一下具体场景么? @467057463

2

为什么controller要和view强关联,不应该是对应着router吗? 如果不满足于RESTful API需要加模板渲染,那也应该是对应请求路径而不是模块名不对吗?

7

router.get('some_path_name', '/xxx', controller.xx)

ctx.routerName/ ctx.routerPath

6

@unclexiao 首先表示感谢~~~ action_name就你说的控制器函数。 我公司项目用的是ruby on rails,我们一般用controller_name和action_name来标示页面。 例如在layout 的body标签上加:

<body class=`${controller_name}_${action_name}`></body>

当访问 articles/newarticles/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越来越好

2

你举例这部分应该也是某个RoR框架的吧,Egg定位是框架的框架,它只是约定了目录结构另加一些内置插件

所以暂时没做这么细致的分工,要实现这个特性也是可以的,需要自己封装。

一般来说,controller作为业务模块,只处理来自router的请求,它和视图(的样式)没有任何关系。

1

@unclexiao eggjs 有能获取所有路由的方法嘛,把route.js所有注册的路由给返回个array出来。还是只能从app.router.stack里面遍历出path出来?

6

你自己封装个方法不就得了

2

能提供个思路吗?

7

Function.name这个怎么拿?

6

纯代码层面,你封装一个 app.registerRouter 给开发者用,里面就可以自己记录了。或者 Proxy 下 router 的方法。