Laravel框架及ThinkPHP框架超级简单的公共文件引入(保留变量)

流氓凡 技术分享 2019-12-28 4.06 K 0

    为什么要把两个框架放在一起来说呢?额。。。因为TP5.1.x与Laravel实在是太像了,本文主要讲述关于大家顶部及底部文件引入的问题。

但是如果顶部和尾部只是单纯的html代码还好说,但是里面通常有变量赋值和循环遍历以及判断等逻辑,这样就带来了比较麻烦的事情。


    首先讲下Laravel框架主要利用AppServiceProvider文件中的boot方法进行全局变量分配。

    也就说在boot方法直接加载header模版文件顺便分配变量到模版中,

    那么无论在其他视图那个地方引入这个公共模版文件都可以直接使用,而不会报变量未找到的错误。

    具体操作:

        找到app/Providers/AppServiceProvider.php文件,在boot方法中加载公共头部模版,比如说:

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use DB;
class AppServiceProvider extends ServiceProvider
{
/**
     * Bootstrap any application services.
     *
     * @return void
     */
public function boot()
{
//
$res = DB::table("eq_type")->where("ishidden", "=", "1")->get(); //取出分类列表
view()->share(['header' => $res]); //分配变量到头部公共导航
}

/**
     * Register any application services.
     *
     * @return void
     */
public function register()
{
//
}
}

后面就直接在其他视图成引入头部导航文件即可

@include("template/default/header")



    OK,那么ThinkPHP能用这种方式吗?NO!虽然他们很像,但是也不是真的一模一样好吧,TP框架除了5.1新出的layout可以尝试达到类似效果,还有一个延续3.2版本下来的好东西,

也是接下来要讲的分层控制器,利用分层控制器机制来实现widget,也就是在模版中调用分层控制器,常规的路由是无法访问到的,相比了解Yii框架的朋友都熟悉这个吧,就是挂件功能的概念。

    首先,我们需要在模块目录下新建一个widget目录(与controller目录同级目录),然后在里面新建控制器header(表示这是头部的文件),然后在index方法下写如下代码:

    重点1:不能使用助手函数view直接渲染模版,否则挂件失败!

    重点2:$this->fetch(); 千万不要以为里面不写模版路径,系统会自动帮你默认,那是不可能的!必须写对应的视图路径!

<?php

namespace app\Admin\widget;

use think\Controller;

class header extends Controller
{
    public function index()
    {
        $this->assign('title','添加账户'); //分配变量
        return $this->fetch('admin/header'); //渲染模版
    }
}

在其他视图层使用:

{:widget('header/index')}

其中header是widget目录下的控制器,index是控制器下的方法!



评论