[英]How to share a variable across all views?
我希望有關系統語言環境的信息在每個視圖中都可用,因此我可以突出顯示用戶當前選擇的任何語言。 經過一番探索之后,我發現了官方文檔中涉及的價值共享問題。 但是,將代碼放入如下的boot()
:
class AppServiceProvider extends ServiceProvider{
public function boot(){
view()->share('locale', \Lang::getLocale());
}
}
在視圖中訪問$locale
變量時,它始終保留默認的系統語言環境,而不是當前選擇的語言環境。 為什么?
我通常使用View Composers,以使其更清晰易讀。
例如,如果要與主導航欄共享一個變量給所有視圖,請遵循以下規則:
您可以使用artisan cli創建服務提供商:
php artisan make:provider ViewComposerServiceProvider
在ViewComposerServiceProvider文件中,創建composeNavigation方法,其中具有刀片模板main.nav-menu ,該模板代表帶有共享變量的navmenu。
ViewComposerServiceProvider看起來像:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
$this->composeNavigation();
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
private function composeNavigation()
{
view()->composer('main.nav-menu', 'App\Http\ViewComposers\NavComposer');
}
}
如您在上面的文件中看到的,我們有App \\ Http \\ ViewComposers \\ NavComposer.php,因此讓我們創建該文件。 在App \\ Http中創建文件夾ViewComposers ,然后在內部創建NavComposer.php文件。
NavComposer.php文件:
<?php
namespace App\Http\ViewComposers;
use App\Repositories\NavMenuRepository;
use Illuminate\View\View;
class NavComposer
{
protected $menu;
public function __construct(NavMenuRepository $menu)
{
$this->menu = $menu;
}
public function compose(View $view)
{
$thing= $this->menu->thing();
$somethingElse = $this->menu->somethingElseForMyDatabase();
$view->with(compact('thing', 'somethingElse'));
}
}
如您在NavComposer.php文件中所見,我們有存儲庫。 通常情況下,我在應用中創建目錄的倉庫,所以在應用程序中創建庫目錄,然后,創建NavMenuRepository.php文件中。
該文件是該設計模式的核心。 在該文件中,我們必須獲取我們要與所有視圖共享的變量的值。
看一下下面的文件:
<?php
namespace App\Repositories;
use App\Thing;
use DB;
class NavMenuRepository
{
public function thing()
{
$getVarForShareWithAllViews = Thing::where('name','something')->firstOrFail();
return $getVarForShareWithAllViews;
}
public function somethingElseForMyDatabase()
{
$getSomethingToMyViews = DB::table('table')->select('name', 'something')->get();
return $getSomethingToMyViews;
}
}
對於小型項目的人:
首先,公認的答案很棒!
對於Laravel 5.2用戶:
像這樣在您的視圖中使用新的Blade指令@inject
@inject('shared','App\\Utilities\\SharedWithView')
那么您可以使用它: {{ $shared->functionName() }}
而SharedWithView是一個像這樣的簡單類:
namespace App\Utilities;
use App\Repositories\SomeRepositoryLikeArticlesRepository;
class SharedWithView {
public function functionName() {
$properNameHere = new SomeRepositoryLikeArticlesRepository();
return $properNameHere->forEaxmpleGetMostViewedArticles( 10 );
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.