如何在所有视图中共享变量?

时间:2016-01-27 14:57:08

标签: php laravel-5

我希望系统区域设置的信息在每个视图中都可用,因此我可以突出显示用户当前选择的任何语言。经过一些谷歌搜索后,我发现了official documentation处理的价值分享问题。但是,将代码放入boot()之后:

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

$locale变量,在视图中访问时,始终包含默认系统区域设置,而不是当前选定的区域。为什么呢?

2 个答案:

答案 0 :(得分:17)

我通常使用View Composers,因此它更清晰,更易读。

例如,如果我想与主导航栏共享一个变量到我的所有视图,我遵循以下规则:

1。创建新的服务提供商

您可以使用artisan cli创建服务提供商:

php artisan make:provider ViewComposerServiceProvider

ViewComposerServiceProvider 文件中,创建 composeNavigation 方法,其中包含代表具有共享变量的navmenu的刀片模板 main.nav-menu

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 ,然后在create 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 文件中看到的那样,我们有了存储库。通常,我在 App 目录中创建一个存储库,因此在 App 中创建存储库目录,然后在 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;
    }

}

答案 1 :(得分:2)

对于项目规模较小的人:

首先,接受的答案很棒!

对于Laravel 5.2用户:

只需在您的观看中使用新的刀片指令@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 );
    }

}