博客列表 >20020117-模板继承中视图合成器的使用-php培训线上九期班

20020117-模板继承中视图合成器的使用-php培训线上九期班

邯郸易住宋至刚
邯郸易住宋至刚原创
2020年02月02日 10:52:20766浏览

模板继承中视图合成器的使用

在公用模板的继承中,如果一旦使用数据库的数据来渲染导航和菜单,那么就在每次调用该模板时的控制器方法中提供数据查询代码,这样,代码也是相当臃肿。为了解决这个问题,laravel框架为我们准备了视图合成器。

一、首先创建一个可供继承的模板base.blade.php

  1. <!--_meta 作为公共模版分离出去-->
  2. <!DOCTYPE HTML>
  3. <html>
  4. <head>
  5. <meta charset="utf-8">
  6. <meta name="renderer" content="webkit|ie-comp|ie-stand">
  7. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  8. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
  9. <meta http-equiv="Cache-Control" content="no-siteapp" />
  10. <link rel="stylesheet" type="text/css" href="/static/lib/jquery/jquery.min.js" />
  11. <link rel="Bookmark" href="favicon.ico" >
  12. <link rel="Shortcut Icon" href="favicon.ico" />
  13. <!--[if lt IE 9]>
  14. <script type="text/javascript" src="/static/lib/html5.js"></script>
  15. <script type="text/javascript" src="/static/lib/respond.min.js"></script>
  16. <![endif]-->
  17. <link rel="stylesheet" type="text/css" href="/static/static/h-ui/css/H-ui.min.css" />
  18. <link rel="stylesheet" type="text/css" href="/static/static/h-ui.admin/css/H-ui.admin.css" />
  19. <link rel="stylesheet" type="text/css" href="/static/lib/Hui-iconfont/1.0.8/iconfont.css" />
  20. <link rel="stylesheet" type="text/css" href="/static/static/h-ui.admin/skin/default/skin.css" id="skin" />
  21. <link rel="stylesheet" type="text/css" href="/static/static/h-ui.admin/css/style.css" />
  22. <!--[if IE 6]>
  23. <script type="text/javascript" src="http://lib.h-ui.net/DD_belatedPNG_0.0.8a-min.js" ></script>
  24. <script>DD_belatedPNG.fix('*');</script>
  25. <![endif]-->
  26. <!--/meta 作为公共模版分离出去-->
  27. <title>@yield('title')</title>
  28. <meta name="keywords" content="H-ui.admin v3.0,H-ui网站后台模版,后台模版下载,后台管理系统模版,HTML后台模版下载">
  29. <meta name="description" content="H-ui.admin v3.0,是一款由国人开发的轻量级扁平化网站后台模板,完全免费开源的网站后台管理系统模版,适合中小型CMS后台系统。">
  30. </head>
  31. <body>
  32. <!--_header 作为公共模版分离出去-->
  33. <header class="navbar-wrapper">
  34. <div class="navbar navbar-fixed-top">
  35. <div class="container-fluid cl"> <a class="logo navbar-logo f-l mr-10 hidden-xs" href="/aboutHui.shtml">易住管理系统</a> <a class="logo navbar-logo-m f-l mr-10 visible-xs" href="/aboutHui.shtml">H-ui</a>
  36. <span class="logo navbar-slogan f-l mr-10 hidden-xs">v3.0</span>
  37. <a aria-hidden="false" class="nav-toggle Hui-iconfont visible-xs" href="javascript:;"></a>
  38. <nav class="nav navbar-nav">
  39. <ul class="cl">
  40. <li class="dropDown dropDown_hover"><a href="javascript:;" class="dropDown_A"><i class="Hui-iconfont"></i> 新增 <i class="Hui-iconfont"></i></a>
  41. <ul class="dropDown-menu menu radius box-shadow">
  42. <li><a href="javascript:;" onclick="article_add('添加资讯','article-add.html')"><i class="Hui-iconfont"></i> 资讯</a></li>
  43. <li><a href="javascript:;" onclick="picture_add('添加资讯','picture-add.html')"><i class="Hui-iconfont"></i> 图片</a></li>
  44. <li><a href="javascript:;" onclick="product_add('添加资讯','product-add.html')"><i class="Hui-iconfont"></i> 产品</a></li>
  45. <li><a href="javascript:;" onclick="member_add('添加用户','member-add.html','','510')"><i class="Hui-iconfont"></i> 用户</a></li>
  46. </ul>
  47. </li>
  48. </ul>
  49. </nav>
  50. <nav id="Hui-userbar" class="nav navbar-nav navbar-userbar hidden-xs">
  51. <ul class="cl">
  52. <li>{{$group['title']}}</li>
  53. <li class="dropDown dropDown_hover"> <a href="#" class="dropDown_A">{{$admin['username']}} <i class="Hui-iconfont"></i></a>
  54. <ul class="dropDown-menu menu radius box-shadow">
  55. <li><a href="javascript:;" onClick="myselfinfo()">个人信息</a></li>
  56. <li><a href="#">切换账户</a></li>
  57. <li><a href="#">退出</a></li>
  58. </ul>
  59. </li>
  60. <li id="Hui-msg"> <a href="#" title="消息"><span class="badge badge-danger">1</span><i class="Hui-iconfont" style="font-size:18px"></i></a> </li>
  61. <li id="Hui-skin" class="dropDown right dropDown_hover"> <a href="javascript:;" class="dropDown_A" title="换肤"><i class="Hui-iconfont" style="font-size:18px"></i></a>
  62. <ul class="dropDown-menu menu radius box-shadow">
  63. <li><a href="javascript:;" data-val="default" title="默认(黑色)">默认(黑色)</a></li>
  64. <li><a href="javascript:;" data-val="blue" title="蓝色">蓝色</a></li>
  65. <li><a href="javascript:;" data-val="green" title="绿色">绿色</a></li>
  66. <li><a href="javascript:;" data-val="red" title="红色">红色</a></li>
  67. <li><a href="javascript:;" data-val="yellow" title="黄色">黄色</a></li>
  68. <li><a href="javascript:;" data-val="orange" title="橙色">橙色</a></li>
  69. </ul>
  70. </li>
  71. </ul>
  72. </nav>
  73. </div>
  74. </div>
  75. </header>
  76. <!--/_header 作为公共模版分离出去-->
  77. <!--_menu 作为公共模版分离出去-->

** <aside class="Hui-aside">

  1. <div class="menu_dropdown bk_2">
  2. @foreach($menus as $menu)
  3. <dl id="menu-member">
  4. <dt><i class="Hui-iconfont"></i> {{$menu['title']}}<i class="Hui-iconfont menu_dropdown-arrow"></i></dt>
  5. @if(isset($menu['children']))
  6. <dd>
  7. @foreach($menu['children'] as $child)
  8. <ul>
  9. <li><a href="/admins/{{$child['controller'].'/'.$child['action']}}" title="{{$child['title']}}">{{$child['title']}}</a></li>
  10. </ul>
  11. @endforeach
  12. </dd>
  13. @endif
  14. </dl>
  15. @endforeach
  16. </div>
  17. </aside>**
  18. <div class="dislpayArrow hidden-xs"><a class="pngfix" href="javascript:void(0);" onClick="displaynavbar(this)"></a></div>
  19. <!--/_menu 作为公共模版分离出去-->
  20. @yield('content')
  21. <!--_footer 作为公共模版分离出去-->
  22. <script type="text/javascript" src="/static/lib/jquery/1.9.1/jquery.min.js"></script>
  23. <script type="text/javascript" src="/static/lib/layer/2.4/layer.js"></script>
  24. <script type="text/javascript" src="/static/static/h-ui/js/H-ui.js"></script>
  25. <script type="text/javascript" src="/static/static/h-ui.admin/js/H-ui.admin.page.js"></script>
  26. <!--/_footer /作为公共模版分离出去-->
  27. <!--请在下方写此页面业务相关的脚本-->
  28. <script type="text/javascript">
  29. </script>
  30. <!--/请在上方写此页面业务相关的脚本-->
  31. </body>
  32. </html>

上述代码中加粗部分即是需要数据渲染的侧边栏。

二、扩展服务提供者ViewServiceProvider

1、创建ViewServiceProvider

(1)切换到项目根目录,通过php artisan make:provider ViewServiceProvider命令行创建;

(2)也可以直接在app\Http\Providers目录下创建ViewServiceProvider。

(3)打开ViewServiceProvider,写入扩展内容,完成后代码如下:

  1. <?php
  2. namespace App\Providers;
  3. use Illuminate\Support\Facades\View;
  4. use Illuminate\Support\ServiceProvider;
  5. class ViewServiceProvider extends ServiceProvider
  6. {
  7. /**
  8. * Register services.
  9. *
  10. * @return void
  11. */
  12. public function register()
  13. {
  14. //
  15. }
  16. /**
  17. * Bootstrap services.
  18. *
  19. * @return void
  20. */
  21. public function boot()
  22. {
  23. // 使用基于合成器的类...
  24. View::composer('base','App\Http\View\Composers\BaseComposer');
  25. // 使用基于合成器的闭包...
  26. View::composer('dashboard', function ($view) {
  27. //
  28. });
  29. }
  30. }

2、注册

找到config\App.php,打开文件,找到”‘providers’ => [ ];”,然后在数组中加入“App\Providers\ViewServiceProvider::class,”,完成注册;

3、创建向Base模板文件渲染数据的视图合成器BaseComposer类,代码如下:

  1. <?php
  2. namespace App\Http\View\Composers;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Support\Facades\DB;
  5. use Illuminate\View\View;
  6. use App\Repositories\UserRepository;
  7. class BaseComposer extends Controller
  8. {
  9. /**
  10. * 实现 UserRepository
  11. *
  12. * @var UserRepository
  13. */
  14. protected $users;
  15. /**
  16. * 创建一个新的 profile 合成器.
  17. *
  18. * @param UserRepository $users
  19. * @return void
  20. */
  21. /*public function __construct(UserRepository $users)
  22. {
  23. // Dependencies automatically resolved by service container...
  24. $this->users = $users;
  25. }*/
  26. /**
  27. * 将数据绑定到视图
  28. *
  29. * @param View $view
  30. * @return void
  31. */
  32. public function compose(View $view)
  33. {
  34. $menus = DB::table('xpcms_admin_menu')
  35. ->where(['status'=>0,'ishidden'=>0])
  36. ->orderBy('mid','asc')->cates('mid');
  37. $menus= $this->gettreeitems($menus,$pid=0);
  38. $data['menus'] = $menus;
  39. $data['admin'] = session('admin');
  40. $data['group'] = DB::table('xpcms_admin_group')->where('gid',$data['admin']['group_id'])->item();
  41. $view->with($data);
  42. }
  43. //获取树形菜单
  44. public function gettreeitems($items,$pid = 0)
  45. {
  46. $tree = [];
  47. foreach ($items as $item){
  48. if ($item['pid'] == $pid){
  49. $tree[$item['mid']] = $item;
  50. $tree[$item['mid']]['children'] = $this->gettreeitems($items,$item['mid']);
  51. }
  52. }
  53. return $tree;
  54. }
  55. }

三、遇到的问题及临时处理办法

这样就完成了视图合成器的扩展,但是在使用过程中会提示public function __construct(UserRepository $users)这个构造方法引入的参数错误,见于目前自己对于PHP、Laravel知识的掌握,尝试多次未能解决报错问题,没有办法,暂时先注释掉,这样,不报错,数据也能正常渲染,但是最终会不会有其它影响,目前还不得而知,想请各位老师和朋友们有时间来解决这个问题。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议