為什么要把兩個框架放在一起來說呢?額。。。因為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是控制器下的方法!