我希望系统区域设置的信息在每个视图中都可用,因此我可以突出显示用户当前选择的任何语言。经过一些谷歌搜索后,我发现了official documentation处理的价值分享问题。但是,将代码放入boot()
之后:
class AppServiceProvider extends ServiceProvider{
public function boot(){
view()->share('locale', \Lang::getLocale());
}
}
$locale
变量,在视图中访问时,始终包含默认系统区域设置,而不是当前选定的区域。为什么呢?
答案 0 :(得分:17)
我通常使用View Composers,因此它更清晰,更易读。
例如,如果我想与主导航栏共享一个变量到我的所有视图,我遵循以下规则:
您可以使用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');
}
}
正如您在上面的文件中看到的,我们有 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'));
}
}
正如您在 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 );
}
}