Blogger Information
Blog 53
fans 3
comment 0
visits 55246
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
20020117-模板继承中视图合成器的使用-php培训线上九期班
邯郸易住宋至刚
Original
767 people have browsed it

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

在公用模板的继承中,如果一旦使用数据库的数据来渲染导航和菜单,那么就在每次调用该模板时的控制器方法中提供数据查询代码,这样,代码也是相当臃肿。为了解决这个问题,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知识的掌握,尝试多次未能解决报错问题,没有办法,暂时先注释掉,这样,不报错,数据也能正常渲染,但是最终会不会有其它影响,目前还不得而知,想请各位老师和朋友们有时间来解决这个问题。

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments