簡體   English   中英

如何在所有視圖中共享變量?

[英]How to share a variable across all views?

我希望有關系統語言環境的信息在每個視圖中都可用,因此我可以突出顯示用戶當前選擇的任何語言。 經過一番探索之后,我發現了官方文檔中涉及的價值共享問題。 但是,將代碼放入如下的boot()

class AppServiceProvider extends ServiceProvider{
    public function boot(){
        view()->share('locale', \Lang::getLocale());
    }
}

在視圖中訪問$locale變量時,它始終保留默認的系統語言環境,而不是當前選擇的語言環境。 為什么?

我通常使用View Composers,以使其更清晰易讀。

例如,如果要與主導航欄共享一個變量給所有視圖,請遵循以下規則:

1.創建新的服務提供商

您可以使用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');
    }
}

2.創建作曲家

如您在上面的文件中看到的,我們有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'));
    }
}

3.創建存儲庫

如您在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM