Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在所有视图中共享变量?_Php_Laravel 5 - Fatal编程技术网

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

Php 如何在所有视图中共享变量?,php,laravel-5,Php,Laravel 5,我希望有关系统语言环境的信息在每个视图中都可用,这样我就可以突出显示用户当前选择的任何语言。通过谷歌搜索,我发现价值共享问题在。但是,将代码放入boot()后,如下所示: class AppServiceProvider extends ServiceProvider{ public function boot(){ view()->share('locale', \Lang::getLocale()); } } 在视图中访问时,$locale变量始终保持

我希望有关系统语言环境的信息在每个视图中都可用,这样我就可以突出显示用户当前选择的任何语言。通过谷歌搜索,我发现价值共享问题在。但是,将代码放入
boot()
后,如下所示:

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

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

我通常使用视图生成器,这样更清晰易读

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

1.创建新的服务提供商 您可以使用artisan cli创建服务提供商:

php artisan make:provider ViewComposer服务提供商

在ViewCompositeServiceProvider文件中,创建ComposenNavigation方法,其中包含刀片模板main.nav-menu,该菜单表示具有共享变量的navmenu

ViewComposer服务提供程序如下所示:

<?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');
    }
}

对于有小项目的人:

首先,被接受的答案太棒了

对于Laravel 5.2用户:

只需在视图中使用新的blade指令
@inject
,如下所示

@inject('shared','App\Utilities\SharedWithView')

然后您可以使用它:
{{$shared->functionName()}

SharedWithView是这样一个简单的类:

namespace-App\Utilities;
使用App\Repositories\SomeRepositoryLikeArticlesRepository;
类SharedWithView{
公共函数functionName(){
$properNameHere=新的SomeRepositoryLikeArticlesRepository();
返回$properNameHere->ExampleGetMostViewedArticles(10);
}
}

我不了解Laravel,但为什么不将其存储在会话变量中呢?我希望尽可能坚持Laravel的最佳实践。我不认为那是一种拉威尔式的做事方式。此外,我上面描述的机制是为了解决这些问题而设计的,因此必须有某种方法“以正确的方式”解决这个问题。无论如何,谢谢你的想法:)啊,好吧,这只是一个建议:)你没有展示你是如何设置语言环境的。同意@panagiotis answer似乎设计过度,尽管仍然很棒(或poli kala)。您的解决方案应该可行,请详细说明这种方法的优缺点好吗?对不起,我是个新手,但我不太清楚。为我的具体情况编写这么多代码不是一件过分的事吗?如果你的项目规模很大,最好遵循这一点,因为这有助于使代码可重用和可读。这取决于您…@Panagiotis我想您只是忘记了将此提供程序添加到您的应用程序的提供程序数组中。
app\providers\viewComposer服务提供程序::class,
如果您需要另一个解决方案用于较旧的Laravel版本,请在下面的注释下这样说:-),我会发布
<?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'));
    }
}
<?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;
    }

}