如何在所有视图之间共享变量?
如何在所有视图之间共享变量?
我希望系统区域设置的信息在每个视图中都可用,这样我就可以突出显示用户当前选择的语言。经过一番搜索,我在官方文档中找到了值共享问题的解决方法。然而,将代码放入boot()
中后,像这样:
class AppServiceProvider extends ServiceProvider{ public function boot(){ view()->share('locale', \Lang::getLocale()); } }
当在视图中访问$locale
变量时,它总是保持默认的系统区域设置,而不是当前选择的语言。为什么呢?
在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版本并需要其他解决方案,请在评论中说明,我会提供相应的解决方案。
在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,