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

Ale*_*mia 11 php laravel-5

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

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

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

Pan*_*ris 19

我通常使用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');
    }
}
Run Code Online (Sandbox Code Playgroud)

2.创建Composer

正如您在上面的文件中看到的那样,我们有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'));
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 如果你的项目很大,最好遵循这个,因为它有助于使代码可重用和可读.由你决定... (2认同)