laravel框架中視圖間共享資料有兩種,一種是用視圖門面share()方法實作,另一種是用視圖門面composer() 方法實作,那么,兩種方法的實作究竟是怎樣的呢?讓我們來看一看接下來的文章內容,
首先,需要注意的一點是:都是使用 View 門面來訪問 Illuminate\Contracts\View\Factory 的底層實作
視圖門面share()方法
有時需要在所有視圖之間共享資料片段,這時候可以使用視圖門面的 share 方法,
1,一般情況下,我會在app\http\Controllers\xx下創建一個基礎控制器 BaseController.php,
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?php
namespace App\Http\Controllers\ExtMan;
use Illuminate\Routing\Controller;
class BaseController extends Controller
{
public function __construct(\Auth $auth)
{
$this->initViewShare(); //視圖共享資料
}
/**
* 視圖共享資料方法
*/
public function initViewShare()
{
view()->share('action_name',get_action_name()); //當前URL的方法器名
}
}
//視圖使用
//共享視圖一般都是在layout中
{{ $action_name }}
|
get_action_name() 是自定義的一個函式,



鏈接:https://pan.baidu.com/s/1v5gm7n0L7TGyejCmQrMh2g 提取碼:x2p5
免費分享,但是X度限制嚴重,如若鏈接失效點擊鏈接或搜索加群 群號518475424,
tips:
創建 app\Helpers\ExtmanFun.php , composer.json的autoload引入
|
1
2
3
|
"files":[
"app/Helpers/ExtmanFun.php"
]
|
運行 composer dump-autoload 會自動加載
2,在 AppServiceProvider 服務提供器(或者新建提供器) 的boot方法中呼叫share()
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
namespace App\Providers;
use View;
class AppServiceProvider extends ServiceProvider
{
/**
* 啟動所有應用服務
*
* @return void
*/
public function boot()
{
View::share('key', 'value');
//也可使用
view()->share('name','共享資料片段');
}
}
|
視圖門面composer()方法
視圖合成器是當視圖被渲染時的回呼函式或類方法 ,如果你每次渲染視圖時都要系結視圖的資料,比如用戶登陸資訊,可以使用composer() 將邏輯組織到一個單獨的地方,
本例中,我們將在AppServiceProvider服務提供器中注冊視圖合成器,
提供器代碼如下:
|
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 AppServiceProvider extends ServiceProvider
{
public function boot()
{
// 使用基于類方法
// 第一個引數可以指定共享給那個視圖,多個視圖用陣列,共享到全部視圖可以用 *
// 或者某個目錄下所有視圖
view()->composer(
//'*', 'App\Http\ViewComposers\AuthComposer'
//['extman.home, welcome'], 'App\Http\ViewComposers\AuthComposer'
['extman.*'], 'App\Http\ViewComposers\AuthComposer'
);
//使用基于回呼函式
view()->composer('*',function($view){
$view->with('user',array('name'=>'test','avatar'=>'/path/to/test.jpg'));
});
}
other code
}
|
如果創建一個新的服務提供器來包含視圖composer 注冊,需要添加該服務提供者到組態檔 config/app.php 的 providers 陣列中
到此已經注冊了視圖合成器,每次渲染 extman目錄下所有視圖時都會執行 AuthComposer@compose 方法,
定義視圖合成器類 App\Http\ViewComposers\AuthComposer.php
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?php
namespace App\Http\ViewComposers;
use Illuminate\View\View;
use Illuminate\Repositories\UserRepository;
class AuthComposer
{
protected $users;
public function __construct(UserRepository $users)
{
// 依賴注入通過服務容器自動決議...
$this->users = $users;
}
//系結資料到視圖
public function compose(View $view)
{
$user_info = \Auth::user();
$view->with('motto', $user_info);
$view->with('count', $this->users->count());
}
}
|
視圖被渲染前,AuthComposer類的 compose 方法被呼叫,同時 Illuminate\View\View 實體被注入該方法,從而可以使用其 with 方法來系結資料到視圖,
所有的視圖合成器都會通過 服務容器 進行決議,所以你可以在視圖合成器的建構式中型別提示需要注入的依賴項,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/122678.html
標籤:PHP
上一篇:php如何在mysql里批量插入資料
下一篇:向php陣列函式array_colum()傳入奇怪的陣列