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

9 浏览
0 Comments

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

我希望系统区域设置的信息在每个视图中都可用,这样我就可以突出显示用户当前选择的语言。经过一番搜索,我在官方文档中找到了值共享问题的解决方法。然而,将代码放入boot()中后,像这样:

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

当在视图中访问$locale变量时,它总是保持默认的系统区域设置,而不是当前选择的语言。为什么呢?

0
0 Comments

在Laravel项目中,有时需要在多个视图之间共享变量。这是因为每个视图都是独立的,无法直接访问其他视图中的变量。为了解决这个问题,我们可以使用blade指令在视图之间共享变量。

对于Laravel 5.2版本的用户,可以使用新的blade指令@shared在视图中共享变量。具体操作如下:

1. 在视图中使用@shared指令定义要共享的变量:

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

2. 在视图中使用共享的变量:

{{ $shared->functionName() }}

在这里,SharedWithView是一个简单的类,用于定义共享变量的方法,代码如下:

namespace App\Utilities;
use App\Repositories\SomeRepositoryLikeArticlesRepository;
class SharedWithView {
    public function functionName() {
        $properNameHere = new SomeRepositoryLikeArticlesRepository();
        return $properNameHere->forEaxmpleGetMostViewedArticles( 10 );
    }
}

如果您使用的是较旧的Laravel版本并需要其他解决方案,请在评论中说明,我会提供相应的解决方案。

0
0 Comments

在Laravel中,如果想要在所有视图中共享一个变量,可以使用视图组合器(View Composers)来实现。下面是实现方法:

1. 创建一个新的服务提供者(Service Provider),可以使用Artisan命令行工具创建:

php artisan make:provider ViewComposerServiceProvider

在ViewComposerServiceProvider文件中创建一个composeNavigation方法,该方法包含了一个名为main.nav-menu的Blade模板,这个模板包含了需要共享的变量。

ViewComposerServiceProvider的代码如下:

<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     *  void
     */
    public function boot()
    {
        $this->composeNavigation();
    }
    /**
     * Register the application services.
     *
     *  void
     */
    public function register()
    {
        //
    }
    private function composeNavigation()
    {
        view()->composer('main.nav-menu', 'App\Http\ViewComposers\NavComposer');
    }
}

2. 创建一个Composer,根据上述代码,我们需要创建一个名为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. 创建一个Repository,在NavComposer.php文件中,我们使用了一个Repository。通常,我会在App目录下创建一个名为Repositories的文件夹,并在其中创建NavMenuRepository.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;
    }
}

以上就是实现在所有视图中共享变量的方法。如果你的项目规模较大,使用这种方法可以使代码更可重用和可读性更好。具体要不要使用这种方法取决于你自己。

另外,你可能忘记将ViewComposerServiceProvider添加到应用程序提供者数组中:App\Providers\ViewComposerServiceProvider::class,

0