请教在模板文件调用控制器用来引入子视图如何实现?
是这样,我的上级以前在国外,在微软做.net开发,现在负责我开发的PHP项目。
目前他负责前端的开发,他要求后端可以实现:
- 视图页面分解成部分视图(组件化,后面称组件),类似日历组件、页面header部分这种
- 在任何页面中都可以调用这个组件,并且组件生成要走控制器可以获得模板变量。
- 可以用ajax调用这个控制器,以获得渲染好的html代码可以直接覆盖页面上的原组件。
目的是为了页面第一次打开由后端渲染好页面,页面打开后可用ajax直接拿到组件的html来覆盖原组件dom。
根据我的调研:
- 在laravel和yii中叫components,tp中叫weight,提供了组件功能,可以由框架渲染这个组件,并且可以使用模板变量这种方式为组件提供数据,将但这种方式不能通过url或ajax请求。
- controller控制器这种可以通过ajax访问到却并不能在视图文件中直接调用。
- 这些框架都支持模板直接引入模板文件,由父页面控制器将页面内组件需要用到的数据统一给到父视图中,再由子视图去使用。但这种办法会很难维护,前端要在那个视图中调用组件,后端就要去那个父视图的控制器提供组件要用的数据。
- 这种开发方式是很久之前的后端mvc开发方式,所有页面在后端渲染返回给前端,目前已经接近过时了。
这些都不能同时实现他的要求,因此我与他发生一些技术上的分歧:他认为这是mvc的标准操作,这样可以使前端更轻,所有渲染让后端来做,以后无论在电脑还是手机的网页都可以运行的很快,并且很抵触后端将数据以json形式返回给前端让前端用js来渲染的做法,认为这样就不符合mvc的概念了。
而我认为mvc只是一种概念,这种功能最多是框架在实现mvc的基础上提供给开发者的一种功能,目前的web开发前端占得比重越来越大了,多数情况下都是前后端分离开发。而且现在的客户端设备性能已经很强大了,加载一个页面不至于让前端卡到什么地步的,反而所有的视图组件由后端渲染好无论在服务器压力或是网络传输都是比较不太好的。
我目前不知道如何实现这种方式,也不知道怎样说服他这种开发方式已经基本抛弃了,他希望我无论用什么方式都要实现。希望有了解的大佬可以指点一下是我没找到正确的实现方式还是确实现在的框架都不支持这种做法,以及这种开发方式对于现在的web开发有何意义,是否国外认为这种方式是主流的web开发方式。
告诉他 我的能力做不到,我只会这样子,你看他怎么办
其实换种思路,他进入页面ajax的时候,你不要去返回页面,返回数据,然后用js渲染就好了,那么写这个组件的时候,既然都有ajax来获取这个的了,初始化就不要去传这个模板变量
pjax?
前后端分离 和 服务端渲染的战争 (逃。 两种都有适合用到的地方,并不是一种对 另外一种不对。
不过,既然人家是领导,你说服不了领导,就只有按照他的吩咐干了。
领导: 我不屑用
vue
react
(其实我不会)微软的大佬…
MVC还是不MVC很难跨前后端一起讨论吧
传json还是html其实都可以,当然传json更‘现代化’一些
LZ上级要的具体是什么组件,虽然没100%搞清楚
但我感觉应该能用Laravel实现,只是所有逻辑都放在了后端,你的工作量肯定是比前端多了
这种开发方式不是那种拖拽生成页面的模式吗?直接生成不是就可以了,只是权限会更细了
我觉得你说的和 livewire 的实现有点像,我个人是觉得这种方案不适合长期维护的项目使用
这种可能只能定制吧
我觉得是可以实现的
主要差别就是返回的是json还是html了不是吗?
前端直接传参数调接口,接口返回 html , 前端拿到结果直接 innerHtml ? 这样要前端意义何在那?
很明白楼主的上级问的这个问题,想要的是什么效果
用过symfony的直接就能想到 {{ render(controller(“AppBundle:Default:Test2”), { ‘tests’: tests }) }}
这个语法就是mvc的v层模板里直接使用,用来包含子视图,(实现机制应该为内部转发),而不是常规的include方式,常规方式正如楼主讲的,扩展性太低,数据都要后端统一查全再返回,框架和框架不同,假如laravel文档里没有推荐过类似的方法的话,大家肯定也想不到还能这么玩,具体有没有大家百度一下
xie.infoq.cn/article/50a5df20d2298...
这篇文章有一些思路值得参考