您的位置:首页 > 编程学习 > > 正文

laravel怎么同时连接数据库(Laravel框架实现多个视图共享相同数据的方法详解)

更多 时间:2022-01-19 00:21:34 类别:编程学习 浏览量:2628

laravel怎么同时连接数据库

Laravel框架实现多个视图共享相同数据的方法详解

本文实例讲述了Laravel框架实现多个视图共享相同数据的方法。分享给大家供大家参考,具体如下:

最近在用Laravel写一个cms,还没有完成,但是也遇到了许多难点,比如cms后台每个视图都要展示相同的导航菜单数据。

环境:

PHP 7.1
Apache 2.4
MySQL 5.7
Laravel 5.4

  • 传统方法

假设使用传统的方法,应该是在每个控制器中都调用数据,然后把数据都塞给视图。

  • ?
  • 1
  • 2
  • $menu = DB::table('menu')->get();
  • return view('xx',['menu'=>$menu]);
    • 稍微优化

    新建一个BaseController,然后让BaseController去获取数据,然后在每个控制器都继承BaseController,最后将数据塞到视图中。

    基类

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • class BaseController{
  •   protected $menu = null;//菜单数据
  •   public function __construct(){
  •     $this->getMenu();//获取导航菜单
  •   }
  •   public function getMenu(){
  •     $this->menu = DB::table('menu')->get();
  •   }
  • }
  • A控制器

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • class AController extends BaseController{
  •   public function index(){
  •     return view('admin.index',['menu'=>$this->menu,'user'=>$user]);
  •   }
  • }
  • 缺点:在每个控制器中都需要重新设置相同的模板的数据(menu)

    • 最好优化方案

    使用Laravel中的View Composers来解决这个问题

    1、在App\Providers下创建一个ComposerServiceProvider类

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • <?php
  • namespace App\Providers;
  • use Illuminate\Support\Facades\View;
  • use Illuminate\Support\ServiceProvider;
  • class ComposerServiceProvider extends ServiceProvider {
  •   /**
  •    * Register bindings in the container.
  •    *
  •    * @return void
  •    */
  •   public function boot() {
  •     // 基于类的view composer
  •     View::composer(
  •       'admin.common.*', 'App\Http\ViewComposers\AdminComposer'
  •     );
  •   }
  •   /**
  •    * Register the service provider.
  •    *
  •    * @return void
  •    */
  •   public function register() {
  •     //
  •   }
  • }
  • 在boot方法中定义要监听的视图,还可以使用通配符,这里我写的是admin.common.*,如果admin.common.* 下的视图被渲染的话将会调用App\Http\ViewComposers\AdminComposer@composer 方法

    2、注册ComposerServiceProvider

    config/app.php文件下的providers数组中进行注册

  • ?
  • 1
  • App\Providers\ComposerServiceProvider::class,
  • 3、创建AdminComposer类

    Laravel推荐把view composer类放在app\Http\ViewComposers目录下,这个目录一开始是没有的,需要新建

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • <?php
  • namespace App\Http\ViewComposers;
  • use App\Libs\CommonUtils;
  • use Illuminate\Http\Request;
  • use Illuminate\View\View;
  • class AdminComposer {
  •   private $data = null;//CommonUtils对象
  •   public function __construct(Request $request) {
  •     $this->data = new CommonUtils($request);//新建一个CommonUtils对象
  •   }
  •   public function compose(View $view) {
  •     $view->with([
  •       'admin' => $this->data->admin,
  •       'mbx' => $this->data->mbx,
  •       'menu' => $this->data->menu,
  •       'msg' => $this->data->msg
  •     ]);//填充数据
  •   }
  • }
  • 在这里我在构造方法中创建了一个对象,这个对象中包含着数据

    5、CommonUtils文件

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • <?php
  • /**
  •  * Created by PhpStorm.
  •  * User: Administrator
  •  * Date: 2017/4/20 0020
  •  * Time: 19:49
  •  */
  • namespace App\Libs;
  • use App\Admin;
  • use App\Perm;
  • use Illuminate\Http\Request;
  • use Illuminate\Support\Facades\DB;
  • class CommonUtils {
  •   public $admin = null;//管理员对象
  •   public $menu = null;//菜单对象
  •   public $mbx = null;//面包屑对象
  •   public $msg = null;//消息对象
  •   /**
  •    * 构造函数
  •    */
  •   public function __construct(Request $request) {
  •     $this->init($request);
  •   }
  •   /**
  •    * 初始化函数
  •    */
  •   private function init(Request $request) {
  •     $this->getAdmin($request);
  •     $this->getMsg();
  •     $this->getMenu($request);
  •     $this->getMbx($request);
  •   }
  •   /**
  •    * 获取管理员数据
  •    */
  •   private function getAdmin() {
  •     $this->admin = session('admin');
  •   }
  •   /**
  •    * 获取后台菜单数据
  •    */
  •   private function getMenu(Request $request) {
  •     $menu = DB::table('menu')->where('parentid', 0)->orderBy('sort')->get();
  •     $router = $request->getPathInfo();
  •     $perm = new Perm();
  •     $mbx = $perm->getMbx($router);
  •     foreach ($menu as $k => $m) {
  •       $m->active = '';
  •       //读取子菜单
  •       $childMenu = DB::table('menu')->where('parentid', $m->id)->orderBy('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->childMenu = $childMenu;
  •       } else {
  •         $m->childMenu = null;
  •       }
  •     }
  •     $this->menu = $menu;
  •   }
  •   /**
  •    * 获取面包屑
  •    */
  •   private function getMbx(Request $request) {
  •     $router = $request->getPathInfo();
  •     $perm = new Perm();
  •     $mbx = $perm->getMbx($router);
  •     $this->mbx = $mbx;
  •   }
  •   /**
  •    * 获取未读消息
  •    */
  •   private function getMsg() {
  •     $adminModel = new Admin();
  •     $toId = $this->admin->id;
  •     $this->msg = $adminModel->getUnReadMsg($toId);
  •   }
  • }
  • 在这里面分别获取了管理员、菜单、面包屑、消息数据,这些数据都是每个后台页面都要使用到的。

    注意:这里我将类定义成了CommonUtils,感觉名字取得不好,CommonUtils是存放在App\Libs下的,这个Libs文件夹是我新建的,用于存放工具类的。如果需要给App\Libs文件夹添加自动加载,需要在composer.json文件里做如下修改。

    laravel怎么同时连接数据库(Laravel框架实现多个视图共享相同数据的方法详解)

    希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

    原文链接:https://blog.csdn.net/baochao95/article/details/70313799

    您可能感兴趣