Я хочу, чтобы информация о языковой системе системы была доступна во всех представлениях, поэтому я мог бы выделить любой язык, выбранный пользователем в данный момент. После некоторых поисковых запросов я нашел проблему совместного использования стоимости, рассмотренную в официальной документации . Однако, после ввода кода в boot()
выполните следующие действия:
class AppServiceProvider extends ServiceProvider{ public function boot(){ view()->share('locale', \Lang::getLocale()); } }
переменная $locale
, при доступе в представлениях, всегда содержит языковой стандарт по умолчанию , а не текущий выбранный. Зачем?
Я обычно использую View Composers, чтобы он стал более понятным и понятным.
Например, если я хочу поделиться переменной с главной навигационной панелью ко всем моим представлениям, я следую приведенным ниже правилам:
Вы можете создать поставщика услуг с помощью artisan cli:
php artisan make:provider ViewComposerServiceProvider
В файле ViewComposerServiceProvider создайте метод composeNavigation, в котором есть основное меню blade-шаблона main.nav , представляющее навигационное меню с общими переменными.
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, поэтому давайте создадим этот файл. Создайте папку ViewComposers в App \ Http, а затем создайте файл 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, у нас есть репозиторий. Обычно я создаю репозиторий в каталоге приложения , поэтому создаю каталог репозиториев в приложении, а затем создаем файл 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; } }
Для людей с небольшим проектом:
Во-первых, принятый ответ потрясающий!
Для пользователей Laravel 5.2:
Просто используйте новую директиву blade @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 ); } }