web-dev-qa-db-ja.com

Laravel 5-すべてのテンプレートで利用可能なグローバルなブレードビュー変数

Laravel 5ですべてのBladeテンプレートで使用できるグローバル変数を作成するにはどうすればよいですか?

55
Limon Monte

オプション1:

view::share()は次のように使用できます。

<?php namespace App\Http\Controllers;

use View;

//You can create a BaseController:

class BaseController extends Controller {

    public $variable1 = "I am Data";

    public function __construct() {

       $variable2 = "I am Data 2";


       View::share ( 'variable1', $this->variable1 );
       View::share ( 'variable2', $variable2 );
       View::share ( 'variable3', 'I am Data 3' );
       View::share ( 'variable4', ['name'=>'Franky','address'=>'Mars'] );
    }  

}

class HomeController extends BaseController {

    //if you have a constructor in other controllers you need call constructor of parent controller (i.e. BaseController) like so:

    public function __construct(){
       parent::__construct();
    }

    public function Index(){
      //All variable will be available in views
      return view('home');
    }

}

オプション2:コンポーザーを使用:

  1. app\Composers\HomeComposer.phpにcomposerファイルを作成します

NB:app\Composersが存在しない場合は作成します

<?php namespace App\Composers;

class HomeComposer
{

    public function compose($view)
    {
        //Add your variables
        $view->with('variable1',      'I am Data')
             ->with('variable2',      'I am Data 2');
    }
}

これにより、composerを任意のビューに添付できます

<?php namespace App\Http\Controllers;

use View;

class HomeController extends Controller{


    public function __construct(){

        View::composers([
            'App\Composers\HomeComposer'  => ['home'] //attaches HomeComposer to home.blade.php
        ]);

    }

    public function Index(){
        return view('home');
    }

}
75
Emeka Mbah

ここに示すように新しいサービスプロバイダーを作成します

新しいサービスプロバイダーを構成ファイル(config/app.php)に追加します。

新しいサービスプロバイダーの起動方法では、次を使用します。

View::share( 'something_cool', 'this is a cool shared variable' );

これで、すべてのビューで$ something_coolを使用する準備ができました。

お役に立てれば。

27
Nic Gutierrez

同じ問題の解決策を検索し、Laravelドキュメントで最適な解決策を見つけました。次のようにAppServiceProviderView::shareを使用するだけです。

View::share('key', 'value');

詳細 ここ

11
sha-1

view composers でこれを行うことができます。ビューコンポーザは、テンプレートがロードされるときに実行されます。そのビューの追加機能を使用してクロージャーを渡すことができます。ビューコンポーザーでは、ワイルドカードを使用できます。すべてのビューに対してcomposerビューを作成するには、*を使用します。

View::composer('*', function($view)
{
    $view->with('variable','Test value');
});

ドキュメントで見ることができるように、クロージャなしでこれを行うこともできます。

View::composer('*', 'App\Http\ViewComposers\ProfileComposer');

プロファイルcomposerクラスには、composeメソッドが必要です。

ビューコンポーザーは、ビューがレンダリングされるときに実行されます。 Laravelにはビュー作成者もいます。これらは、ビューがインスタンス化されるときに実行されます。

SetupLayoutメソッドでBaseControllerを使用することもできます。次に、ロードするすべてのビューは、いくつかの追加データを追加するsetupLayoutメソッドを通じてロードされます。ただし、ビューコンポーザーを使用することで、コードが確実に実行されます。ただし、BaseControllerアプローチを使用すると、余分なデータの読み込みをスキップできるため、柔軟性が向上します。

編集:Nic Gutierrezが述べたように、ビュー共有も使用できます。

10
ArjanSchouten

また、Route.phpファイルでこれを行うことができます。

view()->share('variableName', $variable);
3
Jodeveloper8

view()ファサードヘルパーでミドルウェアを使用したいです。 (Laravel 5.x)

ミドルウェアは管理が容易であり、コントローラのクラスツリーを混乱させません。

手順

ミドルウェアを作成する

/app/Http/Middleware/TimezoneReset.php

ミドルウェアを作成するには、php artisan make:middleware GlobalTimeConfigを実行できます

share()共有する必要があるデータ

 <?php

    namespace App\Http\Middleware;

    use Closure;

    class GlobalTimeConfig
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            $time_settings = [
                'company_timezone' => 'UTC',
                'company_date_format' => 'Y-m-d H:i:s',
                'display_time' => true,
            ];

            view()->share('time_settings', $time_settings);

            return $next($request);
        }
    }

新しく作成されたミドルウェアを登録する

以下の例に従って、ミドルウェアをミドルウェアルートグループに追加します。

/app/Http/Kernel.php

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\GlobalTimeConfig::class,
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

テンプレートからデータにアクセスする

View :: share()メソッド呼び出しで指定されたキーを使用して、任意のテンプレートからデータにアクセスします

例えば。:

    Company timezone: {{ $time_settings['company_timezone'] }}

EDIT:Nic Gutierrezのサービスプロバイダーの答えは、より良い(または最良の)ソリューションかもしれません。

0
Gabi Dj

View::share('key', 'value');View::share(['key'=>'value','key'=>'value'])のような配列を配置できるだけでなく、配列を指定できます

0
Ehab Elzeny