本文实例讲述了Laravel框架实现多个视图共享相同数据的方法。分享给大家供大家参考,具体如下:
最近在用Laravel写一个cms,还没有完成,但是也遇到了许多难点,比如质心系统(质量中心系统的缩写)后台每个视图都要展示相同的导航菜单数据。
环境:
PHP 7.1 Pache 2.4 MySQL 5.7 Laravel 5.4
传统方法假设使用传统的方法,应该是在每个控制器中都调用数据,然后把数据都塞给视图。
$ menu=db : table(' menu ')-get();返回视图(' xx ',[' menu '=$ menu]);稍微优化新建一个基本控制器,然后让基本控制器去获取数据,然后在每个控制器都继承基本控制器,最后将数据塞到视图中。
基类
类基本控制器{受保护的$ menu=null//菜单数据public function _ _ construct(){ $ this-GetMenu();//获取导航菜单}公共函数GetMenu(){ $ this-menu=db : table(' menu ')-get();}}A控制器
类控制器扩展了基本控制器{公共函数索引(){返回视图(' admin。index ',['menu'=$this-menu,' user '=$ user]);}}缺点:在每个控制器中都需要重新设置相同的模板的数据(菜单)
最好优化方案使用Laravel中的查看作曲家来解决这个问题
1、在应用提供商下创建一个ComposerServiceProvider类
?phpnamespace应用程序提供程序使用照明支持立面视图;使用照明支持服务提供商;类ComposerServiceProvider扩展了ServiceProvider { /** *在容器中注册绑定* * @ return void */public函数boot(){//基于类的查看设计者视图:3360作曲家(' admin。常见。*,App Http view composers admin composer’);} /** *注册服务提供商* * @返回void */public function register(){//} }在靴子方法中定义要监听的视图,还可以使用通配符,这里我写的是admin.common.*,如果admin.common. *下的视图被渲染的话将会调用app Http ViewComposers [电子邮件保护]方法
2、注册ComposerServiceProvider
在config/app.php文件下的提供者数组中进行注册
应用程序提供程序合成服务提供程序:3360类,3,创建AdminComposer类
Laravel推荐把查看作曲家类放在appHttpViewComposers目录下,这个目录一开始是没有的,需要新建
?phpnamespace App Http view作曲者;使用应用 Libs 公用程序使用照明 Http 请求使用照明视图视图;类admin composer { private $ data=null;//公共实用程序对象public function _ _ construct(Request $ Request){ $ this-data=new CommonUtils($ Request);//新建一个公用事业对象}公共函数撰写(View $ View){ $ View-with([' admin '=$ this-data-admin,' mbx'=$this-data-mbx,' menu'=$this-data-menu,' msg '=$ this-data-msg]);//填充数据}}在这里我在构造方法中创建了一个对象,这个对象中包含着数据
5、公用事业文件
?php/** *由PhpStorm创建。*用户:管理员*日期: 2017/4/20 0020 *时间: 19:49 */命名空间App Libs使用应用管理;使用应用彼尔姆使用照明 Http 请求使用照明支持立面数据库;类common utils { public $ admin=null//管理员对象public $ menu=null//菜单对象public $ mbx=null/面包屑对象public $ msg=null/消息对象/** * 构造函数*/public function _ _ construct(Request $ Request){ $ this-init($ Request);} /** * 初始化函数*/私有函数init(Request $ Request){ $ this-GetAdmin($ Request);$ this-GetMSg();$ this-GetMenu($ request);$ this-GetMbx($ request);} /** * 获取管理员数据*/私有函数GetAdmin(){ $ this-admin=session(' admin ');} /** * 获取后台菜单数据*/私有函数getMenu(Request $ Request){ $ menu=db :表(' menu ')-其中(“parentid”,0)-排序依据(' sort ')-get();$ router=$ request-getpathninfo();$ Perm=new Perm();$ mbx=$ perm-getMbx($ router);foreach($菜单为$ k=$ m){ $ m-active=' ';//读取子菜单$子菜单=db :表格('菜单')-其中(' parentid ',$ m-id)-排序依据(' sort ')-get();if(count($ childMenu)0){ foreach($ childMenu as $ v){ $ v-active=' ';if($ mbx[0]-router==$ v-router){ $ v-active=' active ';$ m-active=' active ';} } $ m-子菜单=$子菜单;} else { $ m-ChildMenu=null;} } $ this-menu=$ menu;} /** * 获取面包屑*/私有函数getMbx(Request $ Request){ $ router=$ Request-getpathninfo();$ Perm=new Perm();$ mbx=$ perm-getMbx($ router);$ this-mbx=$ mbx;} /** * 获取未读消息*/私有函数getMsg(){ $ adminModel=new Admin();$ ToID=$ this-admin-id;$ this-msg=$ admin model-GetUnradmsg($ ToID);}}在这里面分别获取了管理员、菜单、面包屑、消息数据,这些数据都是每个后台页面都要使用到的。
注意:这里我将类定义成了公用事业,感觉名字取得不好公共设施是存放在AppLibs下的,这个激光诱导击穿光谱仪文件夹是我新建的,用于存放工具类的。如果需要给AppLibs文件夹添加自动加载,需要在composer.json文件里做如下修改。
更多关于Laravel相关内容感兴趣的读者可查看本站专题: 《Laravel框架入门与进阶教程》 、 《php优秀开发框架总结》 、 《php面向对象程序设计入门教程》 、 《php+mysql数据库操作入门教程》 及《php常见数据库操作技巧汇总》
希望本文所述对大家基于Laravel框架的服务器端编程语言(专业超文本预处理器的缩写)程序设计有所帮助。